diff --git a/_maps/RandomRuins/JungleRuins/jungleland_dead_tartemple.dmm b/_maps/RandomRuins/JungleRuins/jungleland_dead_tartemple.dmm deleted file mode 100644 index c959990bdfe6..000000000000 --- a/_maps/RandomRuins/JungleRuins/jungleland_dead_tartemple.dmm +++ /dev/null @@ -1,1827 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ac" = ( -/obj/structure/bonfire/prelit, -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"ad" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"ag" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/helmet/gladiator, -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"ah" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"ai" = ( -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/template_noop) -"aj" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 5 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"ak" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"al" = ( -/turf/template_noop, -/area/template_noop) -"an" = ( -/mob/living/simple_animal/hostile/tar/amalgamation, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aq" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"as" = ( -/obj/item/gun/ballistic/bow, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"at" = ( -/obj/item/ammo_casing/caseless/arrow/bone, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"au" = ( -/obj/structure/stone_tile/slab, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"av" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aw" = ( -/turf/closed/indestructible/riveted/boss, -/area/ruin/unpowered/tar_temple) -"ax" = ( -/obj/structure/bonfire/prelit, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"ay" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"az" = ( -/turf/open/water/tar_basin, -/area/ruin/unpowered/tar_temple) -"aF" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aH" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aI" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aL" = ( -/mob/living/simple_animal/hostile/tar/dryad, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aM" = ( -/obj/item/chair/wood, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aN" = ( -/obj/structure/fluff/tarstatue, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aO" = ( -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aP" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"aS" = ( -/obj/structure/necropolis_gate{ - name = "ancient gate" - }, -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"aV" = ( -/turf/open/floor/plating/jungle_baseturf/dying, -/area/template_noop) -"aX" = ( -/obj/structure/bonfire/prelit, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/template_noop) -"aY" = ( -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"aZ" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/jungle_baseturf/dying, -/area/template_noop) -"cG" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"cX" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"gg" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"ko" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/template_noop) -"pP" = ( -/mob/living/simple_animal/hostile/tar/amalgamation/convert, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"rb" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"rI" = ( -/obj/effect/decal/remains/human, -/obj/item/storage/backpack/satchel/explorer, -/mob/living/simple_animal/hostile/tar/amalgamation/convert, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"wB" = ( -/mob/living/simple_animal/hostile/tar/shade, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"xw" = ( -/obj/effect/decal/remains/human, -/obj/item/storage/belt/quiver, -/obj/item/ammo_casing/reusable/arrow/bamboo, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"zB" = ( -/obj/item/ammo_casing/reusable/arrow/bamboo, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Ci" = ( -/obj/item/clothing/suit/toggle/labcoat, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Du" = ( -/obj/structure/stone_tile/surrounding_tile, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"Dz" = ( -/obj/structure/table/wood, -/obj/item/melee/spear/bamboospear, -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"DD" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"Ek" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Es" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"Fu" = ( -/obj/structure/stone_tile/burnt{ - dir = 4 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Hc" = ( -/obj/item/paper/crumpled{ - info = "These temples appear to be some kind of places of worship, and all house some sort of crystal fragment. This temple appears especially odd, as it seems to resemble some sort of large arena, and the altar within seems especially peculiar, almost as if it is begging to be made complete with an offering. Many of the locals have refused to accompany us to these expeditions no matter our offers, and this one was especially frowned upon, but we do have a few escorts in case anything goes wrong..." - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Hd" = ( -/obj/structure/stone_tile, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Hs" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/mask/gas/explorer, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"JX" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lantern, -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"Kv" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/head/helmet/shaman, -/obj/item/tar_crystal, -/obj/item/melee/spear/bamboospear, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Lw" = ( -/obj/item/flashlight/seclite, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/template_noop) -"Nk" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"RE" = ( -/obj/structure/stone_tile/block, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"Tg" = ( -/obj/structure/tar_altar, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"Uh" = ( -/obj/structure/necropolis_gate{ - name = "ancient gate" - }, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/plating/dirt/jungleland/barren_rocks, -/area/ruin/unpowered/tar_temple) -"Vc" = ( -/obj/item/flashlight/lantern, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"VB" = ( -/obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/asteroid/hivelord/tar, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) -"Wl" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/floor/plating/dirt/jungleland/obsidian, -/area/ruin/unpowered/tar_temple) -"WZ" = ( -/obj/structure/stone_tile/cracked, -/turf/open/floor/plating/dirt/jungleland/dying_forest, -/area/ruin/unpowered/tar_temple) - -(1,1,1) = {" -al -al -al -al -al -ai -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -ai -al -al -al -al -al -al -al -al -al -al -al -"} -(2,1,1) = {" -al -al -al -al -ai -aw -aw -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -al -al -al -"} -(3,1,1) = {" -al -al -al -ai -aw -aw -ac -aY -aY -aY -aY -aY -aY -aY -ad -ad -aY -aY -ad -aY -aY -aY -aY -aY -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -al -al -"} -(4,1,1) = {" -al -al -al -ai -aw -aY -aY -aY -aY -JX -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -al -"} -(5,1,1) = {" -al -al -al -ai -aw -aY -aY -aY -ag -aw -aw -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -"} -(6,1,1) = {" -al -al -al -ai -aw -aY -aY -Dz -aw -aw -aO -aO -aq -aH -aH -aH -aH -aO -aH -aH -aH -aO -aO -aO -aO -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -"} -(7,1,1) = {" -al -al -al -ai -aw -aY -aY -aY -aw -az -aO -ak -av -ak -ak -ak -ak -aM -ak -ak -ak -ak -ak -ak -aO -aO -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -"} -(8,1,1) = {" -al -al -ai -aw -aw -aY -aY -aY -aw -az -ax -az -az -az -az -az -az -az -az -az -az -az -az -az -ax -az -az -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -"} -(9,1,1) = {" -al -ai -aw -aw -aY -aY -aY -aw -aw -az -az -az -az -az -az -az -az -az -az -az -az -az -az -az -az -az -au -az -aw -aw -aY -aY -aY -aw -ai -al -al -al -al -"} -(10,1,1) = {" -ai -aw -aw -aY -aY -aY -aw -aw -az -az -az -az -ay -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -au -aO -au -az -aw -aw -aY -aY -aw -ai -al -al -al -al -"} -(11,1,1) = {" -aw -aw -aY -aY -aY -aw -aw -az -az -az -aN -az -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -au -az -az -aw -aY -aY -aw -aw -ai -al -al -al -"} -(12,1,1) = {" -aw -aY -aY -aY -aw -aw -az -au -az -az -az -az -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -au -az -aN -aw -aY -aY -aY -aw -ai -ai -al -al -"} -(13,1,1) = {" -aw -aY -aY -aw -aw -az -aO -aO -aO -az -az -az -aO -aO -zB -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -au -az -az -aw -ac -aY -aY -aw -ai -ai -ai -al -"} -(14,1,1) = {" -aw -aY -aY -aw -az -aO -aO -aO -ah -aO -az -rI -aO -Fu -au -au -au -au -au -au -aP -au -Ek -aO -aO -aO -aO -au -az -az -aw -aw -aY -aY -aw -ai -ai -ai -ai -"} -(15,1,1) = {" -aw -aY -aY -aw -az -aO -aO -au -aO -aO -az -az -cX -au -Vc -aO -aO -aO -aO -aO -aO -Vc -au -Ek -aO -ah -aO -au -au -az -az -aw -aY -aY -aw -ai -ai -aX -ai -"} -(16,1,1) = {" -aw -aY -ad -aw -az -Vc -aO -at -au -aO -az -aO -au -aO -aO -aO -wB -aO -aO -aO -aO -Ci -Hs -au -aO -at -aO -aO -aO -au -az -aw -aY -aY -aw -ai -ko -ai -ai -"} -(17,1,1) = {" -aw -aY -ad -aw -az -au -au -au -aO -aO -az -az -au -aO -aO -aO -aL -aO -aO -aO -aO -aO -Hc -au -aO -aO -aO -aO -aO -au -az -aw -aY -aY -aw -Lw -ai -ai -ai -"} -(18,1,1) = {" -aw -ad -ad -aw -au -az -az -au -aO -aO -aO -az -au -aO -aO -aO -rb -Es -DD -an -aO -aO -aO -aO -au -aO -aO -aO -aO -aO -au -aw -aY -aY -aw -aw -ai -ai -ai -"} -(19,1,1) = {" -aw -aY -ad -aw -az -Kv -az -az -au -aj -au -au -aO -aO -aO -VB -Wl -Tg -RE -aO -aO -aO -aO -aO -aO -au -au -au -au -au -au -Uh -aY -aY -aY -aS -aV -aZ -aZ -"} -(20,1,1) = {" -aw -aY -ad -aw -au -az -az -au -aO -aO -aO -az -au -aO -aO -aO -gg -cG -Du -an -aO -aO -aO -aO -au -aO -aO -aO -aO -aO -au -aw -aY -aY -aw -aw -ai -ai -ai -"} -(21,1,1) = {" -aw -aY -aY -aw -az -au -au -au -aO -aO -az -az -au -aO -aO -aO -aL -aO -aO -aO -aO -aO -aO -au -aO -aO -aO -aO -aO -au -az -aw -aY -aY -aw -ai -ai -ai -ai -"} -(22,1,1) = {" -aw -aY -aY -aw -az -Vc -aO -aO -au -aO -az -aO -au -aO -aO -aO -wB -zB -aO -aO -pP -aO -aO -au -aO -aO -aO -aO -aO -au -az -aw -aY -aY -aw -ai -ai -ai -ai -"} -(23,1,1) = {" -aw -aY -aY -aw -az -aO -aO -au -aO -aO -az -az -Nk -au -Vc -aO -aO -aO -aO -aO -aO -Vc -au -Hd -aO -aO -aO -au -au -az -az -aw -aY -aY -aw -ai -ai -aX -ai -"} -(24,1,1) = {" -aw -aY -aY -aw -az -aO -aO -aO -at -aO -az -aO -aO -Nk -au -au -au -au -au -au -au -au -WZ -aO -aO -aO -aO -au -az -az -aw -aw -aY -aY -aw -ai -ai -ai -ai -"} -(25,1,1) = {" -aw -aY -aY -aw -aw -az -aO -aO -aO -az -az -az -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -xw -aO -au -az -az -aw -ac -aY -aY -aw -ai -ai -ai -al -"} -(26,1,1) = {" -aw -aY -aY -aY -aw -aw -az -au -az -az -az -az -aO -aO -aO -aO -aO -aO -aO -aO -at -aO -aO -aO -aO -aO -as -au -az -aN -aw -aY -aY -aY -aw -ai -ai -al -al -"} -(27,1,1) = {" -aw -aw -aY -aY -aY -aw -aw -az -az -az -aN -az -ah -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -zB -au -az -az -aw -aY -aY -aw -aw -ai -al -al -al -"} -(28,1,1) = {" -ai -aw -aw -aY -aY -aY -aw -aw -az -az -az -az -av -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -au -aO -au -az -aw -aw -aY -aY -aw -ai -al -al -al -al -"} -(29,1,1) = {" -al -ai -aw -aw -aY -aY -aY -aw -aw -az -az -az -az -az -az -az -az -az -az -az -az -az -az -az -az -az -au -az -aw -aw -aY -aY -aY -aw -ai -al -al -al -al -"} -(30,1,1) = {" -al -al -ai -aw -aw -aY -aY -aY -aw -az -ax -az -az -az -az -az -az -az -az -az -az -az -az -az -ax -az -az -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -"} -(31,1,1) = {" -al -al -al -ai -aw -aY -aY -aY -aw -az -aO -aI -ay -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aI -aO -aO -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -"} -(32,1,1) = {" -al -al -al -ai -aw -aY -aY -JX -aw -aw -aO -aO -aF -aF -aF -aF -aF -aO -aF -aF -aF -aF -aF -aO -aO -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -"} -(33,1,1) = {" -al -al -al -ai -aw -aY -aY -aY -ag -aw -aw -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -"} -(34,1,1) = {" -al -al -al -ai -aw -aY -aY -aY -aY -Dz -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -al -"} -(35,1,1) = {" -al -al -al -ai -aw -aw -ac -aY -aY -aY -aY -aY -ad -ad -ad -ad -ad -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -al -al -"} -(36,1,1) = {" -al -al -al -al -ai -aw -aw -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aY -aw -aw -ai -al -al -al -al -al -al -al -al -al -al -"} -(37,1,1) = {" -al -al -al -al -al -ai -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -ai -al -al -al -al -al -al -al -al -al -al -al -"} diff --git a/_maps/RandomRuins/JungleRuins/jungleland_jungle_sinden.dmm b/_maps/RandomRuins/JungleRuins/jungleland_jungle_sinden.dmm new file mode 100644 index 000000000000..0e15ad195c6f --- /dev/null +++ b/_maps/RandomRuins/JungleRuins/jungleland_jungle_sinden.dmm @@ -0,0 +1,1544 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aB" = ( +/obj/machinery/autolathe, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"aF" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"aS" = ( +/turf/closed/wall/mineral/plastitanium, +/area/ruin/powered/sinden) +"aY" = ( +/obj/machinery/computer/slot_machine/casino, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"bs" = ( +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"bx" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"bM" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"bY" = ( +/turf/open/floor/carpet/royalblack, +/area/template_noop) +"ci" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"cB" = ( +/obj/machinery/vending/hydronutrients{ + onstation = 0 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"cE" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"cM" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"dn" = ( +/obj/structure/closet/crate{ + name = "Poker Coins" + }, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/iron, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/diamond, +/obj/item/coin/diamond, +/obj/item/coin/diamond, +/obj/item/coin/diamond, +/obj/item/coin/diamond, +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"dy" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"dL" = ( +/obj/machinery/door/airlock/wood, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/powered/sinden) +"dZ" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"eN" = ( +/obj/structure/chair/stool/bar{ + pixel_y = 6 + }, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"fv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"gc" = ( +/obj/structure/chair/stool/bar{ + pixel_y = 6 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"gJ" = ( +/turf/open/floor/carpet/royalblack, +/area/ruin/powered/sinden) +"gL" = ( +/obj/machinery/door/window/westright{ + dir = 2 + }, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"gU" = ( +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"hf" = ( +/obj/structure/chair/stool/bar{ + pixel_y = 6 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"hg" = ( +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"hP" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"iM" = ( +/obj/structure/dresser, +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"jc" = ( +/turf/open/floor/plating/dirt/jungleland/jungle, +/area/template_noop) +"jH" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"kn" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"kH" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/powered/sinden) +"lu" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/royalblack, +/area/ruin/powered/sinden) +"mJ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/book/manual/wiki/barman_recipes, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"mX" = ( +/obj/machinery/teleport/station, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"nu" = ( +/obj/structure/chair/wood, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"ny" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"nA" = ( +/obj/structure/closet, +/obj/item/vending_refill/cigarette, +/obj/item/vending_refill/boozeomat, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/storage/bag/trash, +/obj/item/soap, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"oD" = ( +/obj/machinery/vending/cigarette{ + onstation = 0 + }, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"oP" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"oY" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"pL" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"pR" = ( +/obj/machinery/chem_master/condimaster{ + name = "HoochMaster 2000" + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"qE" = ( +/obj/machinery/vending/cigarette{ + onstation = 0 + }, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"qG" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"qO" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"rw" = ( +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"rI" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"rT" = ( +/obj/machinery/vending/boozeomat{ + onstation = 0 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"sr" = ( +/obj/structure/flora/tree/palm, +/turf/open/floor/plating/dirt/jungleland/jungle, +/area/template_noop) +"sV" = ( +/obj/structure/table/wood, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/poddoor/shutters{ + id = "dencounter" + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"tr" = ( +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"tH" = ( +/obj/structure/chair/stool/bar{ + pixel_y = 6 + }, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"tW" = ( +/obj/machinery/door/airlock/wood{ + req_access_txt = "25" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"tZ" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"uM" = ( +/obj/machinery/vending/dinnerware{ + onstation = 0 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"uV" = ( +/obj/machinery/door/airlock/diamond, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "denentrance" + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/powered/sinden) +"ve" = ( +/obj/machinery/computer/teleporter{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"vH" = ( +/obj/structure/bed, +/obj/effect/mob_spawn/human/greedydemon{ + dir = 8 + }, +/obj/item/bedsheet/cult, +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"vO" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"wd" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"wS" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"wZ" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"xT" = ( +/obj/machinery/door/airlock/wood{ + req_access_txt = "25" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"zw" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/storage/box/dishdrive, +/obj/item/gun/ballistic/revolver/russian, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"zK" = ( +/obj/item/book/manual/wiki/hydroponicsplants, +/obj/structure/closet/crate/hydroponics, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/plant_analyzer, +/obj/item/hatchet, +/obj/item/shovel/spade, +/obj/item/cultivator, +/obj/item/reagent_containers/glass/bucket/wooden, +/obj/item/reagent_containers/glass/bucket/wooden, +/obj/item/storage/box/disks_plantgene, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"AF" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Br" = ( +/obj/machinery/vending/cigarette{ + onstation = 0 + }, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"BG" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/powered/sinden) +"Cn" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/pill_bottle/dice, +/obj/item/toy/cards/deck, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"CK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/beacon, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"Dl" = ( +/obj/machinery/smartfridge/food, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"DP" = ( +/obj/machinery/smartfridge/disks, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"DQ" = ( +/obj/structure/table/wood/fancy/exoticpurple, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"ED" = ( +/obj/machinery/plantgenes, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"FB" = ( +/obj/machinery/processor, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"FY" = ( +/obj/machinery/oven, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Ha" = ( +/obj/structure/sign/barsign, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ruin/powered/sinden) +"Hf" = ( +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"Hq" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"HC" = ( +/obj/effect/spawner/structure/window/plastitanium, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"HD" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + req_access = list(25) + }, +/obj/item/storage/firstaid/regular, +/obj/item/stack/spacecash/c200, +/obj/item/stack/spacecash/c100, +/obj/item/stack/spacecash/c50, +/obj/item/stack/spacecash/c50, +/obj/item/stack/spacecash/c50, +/obj/item/stack/spacecash/c20, +/obj/item/stack/spacecash/c20, +/obj/item/stack/spacecash/c10, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/item/holochip{ + credits = 400 + }, +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"HS" = ( +/obj/structure/chair/wood, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"IQ" = ( +/obj/machinery/computer/slot_machine/casino, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"Jh" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"JY" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/plating/dirt/jungleland/jungle, +/area/template_noop) +"Kd" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/sink{ + pixel_y = 30 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Ln" = ( +/obj/machinery/door/airlock/wood{ + req_access_txt = "25" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/carpet/black, +/area/ruin/powered/sinden) +"LL" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"Mb" = ( +/obj/machinery/button/door{ + id = "denentrance"; + name = "Den Entrance Shutter"; + pixel_x = -26; + pixel_y = -6 + }, +/obj/machinery/button/door{ + id = "dencounter"; + name = "Den Counter Shutter"; + pixel_x = -26; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"Nb" = ( +/obj/machinery/door/airlock/wood{ + req_access_txt = "25" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"Nr" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/machinery/light, +/obj/item/storage/box/ingredients/wildcard, +/obj/item/storage/box/ingredients/carnivore, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Nu" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/enzyme, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Oo" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table/wood/fancy/exoticpurple, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/carpet/purple, +/area/ruin/powered/sinden) +"OF" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"OK" = ( +/obj/machinery/door/airlock/wood, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"ON" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"OV" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"PD" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/door/window/southleft, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"PP" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Rn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/portable_atmospherics/canister/air, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"SH" = ( +/obj/machinery/vending/hydroseeds{ + onstation = 0 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"SU" = ( +/obj/machinery/telecomms/relay/preset/telecomms{ + generates_heat = 0; + use_power = 0 + }, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"Tm" = ( +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"Tp" = ( +/obj/machinery/griddle, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Tw" = ( +/obj/structure/table/wood/poker, +/obj/item/ashtray, +/turf/open/floor/carpet/red, +/area/ruin/powered/sinden) +"Uo" = ( +/obj/machinery/jukebox, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"Us" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"Va" = ( +/obj/machinery/door/airlock/wood{ + req_access_txt = "25" + }, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"Wd" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"WL" = ( +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"WY" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/gloves/color/fyellow, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/powered/sinden) +"Xg" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"Xl" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/mixbowl, +/obj/item/kitchen/knife, +/turf/open/floor/mineral/titanium, +/area/ruin/powered/sinden) +"Xt" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/floor/carpet/green, +/area/ruin/powered/sinden) +"Zp" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, +/turf/open/floor/wood, +/area/ruin/powered/sinden) +"ZW" = ( +/obj/structure/chair/stool/bar{ + pixel_y = 6 + }, +/turf/open/floor/carpet/royalblack, +/area/ruin/powered/sinden) + +(1,1,1) = {" +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +"} +(2,1,1) = {" +jc +jc +jc +jc +jc +jc +jc +jc +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +sr +jc +"} +(3,1,1) = {" +jc +jc +jc +jc +kH +kH +kH +kH +kH +lu +gJ +Xg +bs +Jh +bs +gJ +gJ +qE +IQ +hf +IQ +tH +IQ +tH +Ha +jc +sr +"} +(4,1,1) = {" +jc +jc +jc +jc +kH +jH +gU +Mb +sV +ZW +gJ +bM +tZ +Xt +tZ +gJ +gJ +Tm +Tw +Tm +Tw +Tm +Tw +Tm +kH +jc +jc +"} +(5,1,1) = {" +jc +jc +jc +jc +kH +Zp +gU +gU +sV +ZW +gJ +bs +oP +oP +oP +gJ +gJ +vO +IQ +tH +IQ +tH +IQ +tH +kH +JY +jc +"} +(6,1,1) = {" +jc +kH +kH +kH +kH +mJ +gU +gU +sV +ZW +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +uV +bY +bY +"} +(7,1,1) = {" +jc +kH +zw +gU +kH +LL +gU +gU +sV +ZW +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +gJ +uV +bY +bY +"} +(8,1,1) = {" +jc +kH +nA +gU +kH +rT +gU +gU +sV +ZW +gJ +bs +Uo +bs +bM +gJ +gJ +ci +IQ +tH +IQ +tH +IQ +tH +kH +JY +jc +"} +(9,1,1) = {" +jc +kH +pR +gU +Va +gU +gU +Dl +kH +kH +kH +bs +bs +bs +bs +gJ +gJ +Tm +Tw +Tm +Tw +Tm +Tw +Tm +kH +jc +jc +"} +(10,1,1) = {" +jc +kH +kH +kH +kH +kH +gU +gU +tW +bs +bs +bs +oP +oP +bs +gJ +gJ +ci +IQ +gc +IQ +tH +IQ +tH +kH +jc +sr +"} +(11,1,1) = {" +jc +kH +zK +ny +Hq +kH +Nb +kH +kH +kH +bs +bs +tZ +tZ +eN +gJ +gJ +kH +kH +kH +kH +kH +kH +kH +kH +jc +jc +"} +(12,1,1) = {" +jc +kH +Kd +ON +PD +tr +tr +tr +Tp +kH +bs +HS +Xt +tZ +eN +gJ +gJ +Tm +OV +tr +rI +kH +jc +jc +jc +jc +jc +"} +(13,1,1) = {" +jc +kH +wd +wd +hP +wS +tr +tr +FY +kH +bs +bs +tZ +tZ +eN +gJ +gJ +qE +kH +AF +hg +kH +jc +jc +sr +jc +jc +"} +(14,1,1) = {" +jc +kH +ED +wd +hP +qG +tr +FB +kH +kH +OF +bs +oP +oP +bs +gJ +gJ +ci +kH +kH +kH +kH +kH +kH +jc +jc +sr +"} +(15,1,1) = {" +jc +kH +PP +ON +PD +tr +tr +Nr +kH +aY +eN +bs +oP +oP +bs +gJ +gJ +vO +HC +oD +rw +aF +aF +kH +jc +jc +jc +"} +(16,1,1) = {" +jc +kH +DP +ON +kn +Nu +tr +Wd +kH +Cn +bs +bs +tZ +tZ +eN +gJ +gJ +gJ +dL +rw +rw +DQ +DQ +kH +jc +jc +jc +"} +(17,1,1) = {" +jc +kH +kH +cB +SH +Xl +tr +cM +kH +bs +bs +HS +Xt +tZ +eN +gJ +BG +Tm +HC +rw +rw +cE +cE +kH +jc +jc +jc +"} +(18,1,1) = {" +jc +jc +kH +kH +kH +kH +tr +uM +kH +Us +bs +bs +tZ +tZ +eN +gJ +kH +kH +kH +Oo +rw +aF +aF +kH +jc +jc +jc +"} +(19,1,1) = {" +jc +jc +kH +dn +iM +kH +Ln +aS +kH +bM +bs +bs +oP +oP +bs +gJ +kH +rw +aF +rw +rw +DQ +DQ +kH +jc +jc +jc +"} +(20,1,1) = {" +jc +jc +kH +Hf +Hf +Hf +Hf +dZ +kH +Br +bs +bs +bs +bs +bs +gJ +kH +nu +DQ +pL +rw +cE +cE +kH +jc +jc +jc +"} +(21,1,1) = {" +jc +jc +kH +kH +HD +oY +vH +kH +kH +kH +xT +kH +kH +kH +kH +OK +kH +nu +DQ +pL +rw +rw +bx +kH +jc +jc +jc +"} +(22,1,1) = {" +jc +jc +jc +kH +kH +kH +kH +kH +aB +qO +WL +Rn +kH +fv +CK +fv +kH +rw +cE +rw +rw +kH +kH +kH +jc +jc +jc +"} +(23,1,1) = {" +jc +jc +jc +jc +jc +jc +kH +WY +WL +dy +gL +SU +kH +ve +mX +wZ +kH +kH +kH +kH +kH +kH +jc +jc +jc +jc +jc +"} +(24,1,1) = {" +jc +jc +jc +jc +jc +jc +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +kH +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +"} +(25,1,1) = {" +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +jc +"} diff --git a/_maps/RandomRuins/JungleRuins/jungleland_tar_king.dmm b/_maps/RandomRuins/JungleRuins/jungleland_tar_king.dmm new file mode 100644 index 000000000000..f9c21ef6a911 --- /dev/null +++ b/_maps/RandomRuins/JungleRuins/jungleland_tar_king.dmm @@ -0,0 +1,2010 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ac" = ( +/obj/structure/bonfire, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"ad" = ( +/mob/living/simple_animal/hostile/tar/dryad, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"ag" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"ah" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"ai" = ( +/turf/open/floor/plating/dirt/jungleland/dying_forest, +/area/template_noop) +"aj" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5; + pixel_x = -2 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"ak" = ( +/obj/item/melee/spear/bamboospear{ + pixel_x = -11; + pixel_y = 6 + }, +/obj/item/flashlight/flare/torch{ + pixel_x = -13; + pixel_y = 13 + }, +/obj/item/tar_crystal{ + pixel_x = -6; + pixel_y = -3 + }, +/obj/item/paper/crumpled/ruins/jungle/tar_king_note{ + pixel_x = 14; + pixel_y = -18 + }, +/obj/effect/decal/remains/human, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"al" = ( +/turf/template_noop, +/area/template_noop) +"an" = ( +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aq" = ( +/obj/structure/flora/ausbushes/brflowers{ + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a dim glow and a smell akin to burnt plastic."; + name = "lonely flowers"; + light_range = 4; + light_power = 0.5; + gender = "plural" + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"as" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"at" = ( +/obj/structure/stone_tile/surrounding_tile/burnt, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"au" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"av" = ( +/obj/structure/flora/ausbushes/lavendergrass{ + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a dim glow and a smell akin to burnt plastic."; + name = "lonely flowers"; + light_range = 4; + light_power = 0.5; + gender = "plural" + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"aw" = ( +/turf/closed/indestructible/riveted/boss, +/area/ruin/unpowered/tar_temple) +"ax" = ( +/obj/structure/flora/ausbushes/brflowers{ + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a smell akin to burnt plastic."; + name = "lonely flowers"; + light_range = 4; + light_power = 0.5; + gender = "plural" + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"ay" = ( +/obj/structure/flora/ausbushes/lavendergrass{ + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a dim glow and a smell akin to burnt plastic."; + name = "lonely flowers"; + light_power = 0.5; + light_range = 4; + gender = "plural" + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"az" = ( +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aF" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aH" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aI" = ( +/obj/structure/flora/ausbushes/ppflowers{ + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a dim glow and a smell akin to burnt plastic."; + name = "lonely flowers"; + light_power = 0.5; + light_range = 4; + gender = "plural" + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"aL" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aM" = ( +/obj/structure/tar_altar, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aN" = ( +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"aO" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aP" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aS" = ( +/obj/structure/necropolis_gate{ + name = "ancient gate" + }, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"aV" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/burnt, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"aX" = ( +/obj/structure/bonfire, +/turf/open/floor/plating/dirt/jungleland/dying_forest, +/area/template_noop) +"aY" = ( +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"aZ" = ( +/mob/living/simple_animal/hostile/asteroid/hivelord/tar, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"cG" = ( +/mob/living/simple_animal/hostile/tar/amalgamation/convert, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"cX" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"gg" = ( +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"ko" = ( +/obj/structure/flora/ausbushes/brflowers{ + name = "lonely flowers"; + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a dim glow and a smell akin to burnt plastic."; + light_power = 0.5; + light_range = 4; + gender = "plural" + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"oH" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"pP" = ( +/mob/living/simple_animal/hostile/tar/amalgamation, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"rb" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"rI" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"tG" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"wB" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"xw" = ( +/obj/structure/flora/ausbushes/lavendergrass{ + name = "lonely flowers"; + light_power = 0.5; + light_range = 4; + gender = "plural"; + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a dim glow and a smell akin to burnt plastic." + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"zh" = ( +/obj/item/clothing/head/helmet/gladiator{ + pixel_y = 11; + pixel_x = -8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"zB" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Ci" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Co" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/burnt{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Du" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Dz" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"DD" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Ek" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Es" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Fu" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"FX" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4; + icon_state = "cracked_slab1" + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Hc" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 9 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Hd" = ( +/mob/living/simple_animal/hostile/tar/shade, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"Hs" = ( +/obj/structure/stone_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Kv" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Lw" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/obj/item/reagent_containers/glass/bottle{ + pixel_y = 6; + pixel_x = -10; + list_reagents = list(/datum/reagent/sulphur = 0.5, /datum/reagent/water = 0.5) + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Nk" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Og" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 6 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"RE" = ( +/obj/item/flashlight/lantern, +/turf/open/floor/plating/dirt/jungleland/dying_forest, +/area/template_noop) +"Tg" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Uh" = ( +/obj/structure/necropolis_gate{ + name = "ancient gate" + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating/dirt/jungleland/barren_rocks, +/area/ruin/unpowered/tar_temple) +"Vc" = ( +/obj/structure/flora/ausbushes/ywflowers{ + desc = "Stems fused to the obsidian floor, they seem to be dripping some black, viscous fluid, filling the room with a dim glow and a smell akin to burnt plastic."; + name = "lonely flowers"; + light_power = 0.5; + light_range = 4; + gender = "plural" + }, +/turf/open/floor/plating/dirt/jungleland/obsidian, +/area/ruin/unpowered/tar_temple) +"VB" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"Wl" = ( +/obj/structure/stone_tile/block, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) +"WZ" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/turf/open/water/tar_basin, +/area/ruin/unpowered/tar_temple) + +(1,1,1) = {" +al +al +al +al +al +ai +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +ai +al +al +al +al +al +al +al +al +al +al +"} +(2,1,1) = {" +al +al +al +al +ai +aw +aw +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +pP +aY +aY +aY +aY +cG +aw +aw +ai +al +al +al +al +al +al +al +al +al +"} +(3,1,1) = {" +al +al +al +ai +aw +aw +ac +Hd +aY +aY +aY +aY +aY +aY +aY +ad +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aw +aw +ai +al +al +al +al +al +al +al +al +"} +(4,1,1) = {" +al +al +al +ai +aw +aY +aY +aY +aY +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aY +aY +aY +aw +aw +ai +al +al +al +al +al +al +al +"} +(5,1,1) = {" +al +al +al +ai +aw +aY +aY +aY +aw +aw +az +az +az +az +az +az +az +az +az +az +az +az +az +az +az +aw +ac +aY +aY +aY +aw +aw +ai +al +al +al +al +al +al +"} +(6,1,1) = {" +al +al +al +ai +aw +pP +aY +aw +aw +az +az +az +az +az +az +az +az +az +az +az +az +az +az +az +az +aw +aw +aw +aY +pP +aY +aw +aw +ai +al +al +al +al +al +"} +(7,1,1) = {" +al +al +al +ai +aw +aY +aY +aw +az +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +az +aw +aw +aY +aY +aY +aw +aw +ai +al +al +al +al +"} +(8,1,1) = {" +al +al +ai +aw +aw +aY +aY +aw +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +az +aw +aw +aY +aY +aY +aw +aw +ai +al +al +al +"} +(9,1,1) = {" +al +ai +aw +aw +aY +aY +aZ +aw +az +az +aN +aN +aN +aN +aN +aN +aN +ax +aN +aN +aN +aN +aN +aN +aN +aN +az +az +az +aw +aw +aY +aY +aY +aw +ai +al +al +al +"} +(10,1,1) = {" +ai +aw +aw +aY +aY +aY +aw +aw +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aI +aN +aN +aN +aN +aN +az +az +az +aw +aw +aY +aY +aw +ai +al +al +al +"} +(11,1,1) = {" +aw +aw +aY +pP +aY +aw +aw +az +az +az +aN +aN +aN +aN +aI +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +az +aw +aY +aY +aw +aw +ai +al +al +"} +(12,1,1) = {" +aw +ac +aY +aY +aw +aw +az +az +az +az +aN +aN +ay +aN +aN +aN +aN +aN +ay +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +aw +aY +cG +aY +aw +ai +al +al +"} +(13,1,1) = {" +aw +aY +aY +aw +aw +az +az +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +av +aN +az +az +aw +ac +aY +aY +aw +ai +ai +al +"} +(14,1,1) = {" +aw +aY +aY +aw +az +az +az +VB +ah +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +aw +aw +aY +aY +aw +ai +ai +ai +"} +(15,1,1) = {" +aw +aY +aY +aw +az +az +az +Fu +rI +ah +az +az +aN +aN +aN +aq +aN +aN +aN +aN +aN +aN +aq +aN +aN +aN +aN +aN +aN +aN +az +az +aw +aY +aY +aw +ai +aX +ai +"} +(16,1,1) = {" +aw +aY +aY +aw +az +az +az +az +Fu +at +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +aw +aY +aY +aw +ai +ai +ai +"} +(17,1,1) = {" +aw +cG +aY +aw +az +az +az +az +az +az +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aI +aN +aN +aN +aN +aN +az +aw +aY +cG +aw +ai +ai +ai +"} +(18,1,1) = {" +aw +aY +aY +aw +az +as +an +aP +aH +wB +oH +gg +ag +aN +aN +aN +aN +aN +aI +aN +WZ +cX +Dz +aN +aN +aN +aN +aN +aN +aN +aN +az +aw +aY +aY +aw +aw +ai +ai +"} +(19,1,1) = {" +aw +aY +aY +Uh +az +Kv +FX +Hc +Kv +aj +Og +au +aF +aN +aN +aN +aN +aN +aN +aN +DD +aM +Wl +aN +aN +aN +aN +aN +Vc +aN +aN +az +aw +aY +aY +aY +aS +ai +ai +"} +(20,1,1) = {" +aw +aY +aY +aw +az +Ci +Ek +Hs +rb +Co +aO +aV +Du +aN +Vc +aN +aN +aN +aN +aN +Nk +Es +Tg +aN +aN +aN +aN +aN +aN +aN +aN +az +aw +aY +aY +aw +aw +ai +ai +"} +(21,1,1) = {" +aw +aY +aY +aw +az +az +az +az +az +az +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +aw +aY +aY +aw +ai +ai +RE +"} +(22,1,1) = {" +aw +aY +aY +aw +az +az +az +az +VB +zB +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +ko +aN +aN +aN +aN +aN +aN +az +az +aw +cG +aY +aw +ai +ai +ai +"} +(23,1,1) = {" +aw +aY +cG +aw +az +az +ak +Lw +aL +at +az +az +aN +aN +aN +ay +aN +aN +aN +aN +xw +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +aw +aY +aY +aw +ai +aX +ai +"} +(24,1,1) = {" +aw +aY +aY +aw +az +az +zh +tG +at +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aq +aN +az +az +aw +aw +aY +aY +aw +ai +ai +ai +"} +(25,1,1) = {" +aw +aY +aY +aw +aw +az +az +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +aw +ac +aY +aY +aw +ai +ai +al +"} +(26,1,1) = {" +aw +ac +aY +aY +aw +aw +az +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +aw +aY +aY +cG +aw +ai +al +al +"} +(27,1,1) = {" +aw +aw +aY +pP +aY +aw +aw +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +Vc +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +az +aw +aY +aY +aw +aw +ai +al +al +"} +(28,1,1) = {" +ai +aw +aw +aY +aY +aY +aw +aw +az +az +aN +aN +aN +aq +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aI +aN +aN +az +az +az +aw +aw +aY +pP +aw +ai +al +al +al +"} +(29,1,1) = {" +al +ai +aw +aw +aY +aY +aZ +aw +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aI +aN +aN +aN +aN +az +az +az +aw +aw +aY +aY +aY +aw +ai +al +al +al +"} +(30,1,1) = {" +al +al +ai +aw +aw +aY +aY +aw +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +az +aw +aw +aY +aY +aY +aw +aw +ai +al +al +al +"} +(31,1,1) = {" +al +al +al +ai +aw +aY +aY +aw +az +az +az +az +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +aN +az +az +az +aw +aw +aY +aY +aY +aw +aw +ai +al +al +al +al +"} +(32,1,1) = {" +al +al +al +ai +aw +aY +aY +aw +aw +az +az +az +az +az +az +az +az +az +az +az +az +az +az +az +az +aw +aw +aw +aY +aY +aY +aw +aw +ai +al +al +al +al +al +"} +(33,1,1) = {" +al +al +al +ai +aw +aY +aY +aY +aw +aw +az +az +az +az +az +az +az +az +az +az +az +az +az +az +az +aw +ac +aY +aY +aY +aw +aw +ai +al +al +al +al +al +al +"} +(34,1,1) = {" +al +al +al +ai +aw +aY +aY +pP +aY +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aY +aY +cG +aw +aw +ai +al +al +al +al +al +al +al +"} +(35,1,1) = {" +al +al +al +ai +aw +aw +ac +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +aY +pP +aY +aY +aY +aY +aw +aw +ai +al +al +al +al +al +al +al +al +"} +(36,1,1) = {" +al +al +al +al +ai +aw +aw +aY +aY +Hd +aY +aY +aY +aY +aY +aY +aY +ad +aY +aY +aY +aY +aY +aY +aY +aY +aY +aw +aw +ai +al +al +al +al +al +al +al +al +al +"} +(37,1,1) = {" +al +al +al +al +al +ai +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +ai +al +al +al +al +al +al +al +al +al +al +"} diff --git a/_maps/RandomRuins/SpaceRuins/Academy.dmm b/_maps/RandomRuins/SpaceRuins/Academy.dmm index 8530c2c8aa32..8bd54bf54b7a 100644 --- a/_maps/RandomRuins/SpaceRuins/Academy.dmm +++ b/_maps/RandomRuins/SpaceRuins/Academy.dmm @@ -279,7 +279,7 @@ /turf/open/floor/plating, /area/awaymission/academy/academycellar) "eT" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plasteel{ icon_state = "showroomfloor" }, diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index 73459817374f..8b2b1af62a6e 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -1283,7 +1283,7 @@ /area/ruin/space/derelict/bridge) "ee" = ( /obj/structure/window/reinforced, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plasteel/airless{ icon_state = "damaged3" }, diff --git a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm index b3f39a3d88fc..c9ffde4ee407 100644 --- a/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm +++ b/_maps/RandomRuins/SpaceRuins/gasthelizards.dmm @@ -237,7 +237,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plasteel, /area/ruin/space/has_grav/gasthelizard) "F" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 8368d618055f..0ab6c8bbf3f3 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -4473,7 +4473,7 @@ /area/ruin/space/has_grav/ancientstation/rnd) "pN" = ( /obj/structure/window/plasma/reinforced/spawner/north, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, /area/ruin/space/has_grav/ancientstation/engi) "pO" = ( @@ -6303,7 +6303,7 @@ /turf/template_noop, /area/ruin/space/has_grav/ancientstation/solararray) "As" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible/layer4{ dir = 8 }, @@ -8367,7 +8367,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/engi) "OO" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/ruin/space/has_grav/ancientstation/engi) diff --git a/_maps/RandomRuins/StationRuins/BoxStation/engine_reactor.dmm b/_maps/RandomRuins/StationRuins/BoxStation/engine_reactor.dmm index 3434cc5d0a89..771448ac533c 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/engine_reactor.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/engine_reactor.dmm @@ -95,7 +95,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "AI Satellite Access"; - req_one_access_txt = "10;17;32" + req_access_txt = "10" }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 9 diff --git a/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm b/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm index 849894207bb9..74af589cfc2c 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/engine_singulo_tesla.dmm @@ -829,7 +829,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "AI Satellite Access"; - req_one_access_txt = "10;17;32" + req_access_txt = "10" }, /turf/open/floor/plasteel, /area/engine/engineering) diff --git a/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm b/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm index 2be707c2207d..2edff640fdc0 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/engine_sm.dmm @@ -1762,7 +1762,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "AI Satellite Access"; - req_one_access_txt = "10;17;32" + req_access_txt = "10" }, /turf/open/floor/plasteel, /area/engine/engineering) diff --git a/_maps/RandomRuins/StationRuins/BoxStation/engine_teg.dmm b/_maps/RandomRuins/StationRuins/BoxStation/engine_teg.dmm index ba17eaa82c1b..15d47396a728 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/engine_teg.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/engine_teg.dmm @@ -1003,7 +1003,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "AI Satellite Access"; - req_one_access_txt = "10;17;32" + req_access_txt = "10" }, /turf/open/floor/plasteel, /area/engine/engineering) diff --git a/_maps/RandomRuins/StationRuins/BoxStation/transfer7.dmm b/_maps/RandomRuins/StationRuins/BoxStation/transfer7.dmm index 5452ae9b4cba..1c1032ea4d13 100644 --- a/_maps/RandomRuins/StationRuins/BoxStation/transfer7.dmm +++ b/_maps/RandomRuins/StationRuins/BoxStation/transfer7.dmm @@ -440,7 +440,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plasteel/white, /area/template_noop) "T" = ( diff --git a/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm b/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm index 056d37ad637a..e8175c609273 100644 --- a/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm +++ b/_maps/RandomRuins/StationRuins/GaxStation/ai_whale.dmm @@ -7,9 +7,6 @@ /turf/open/floor/plating, /area/tcommsat/computer) "aA" = ( -/obj/machinery/computer/ai_resource_distribution{ - dir = 8 - }, /obj/machinery/computer/security/telescreen{ dir = 8; name = "MiniSat Camera Monitor"; @@ -42,6 +39,12 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/ai) +"aY" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "bb" = ( /obj/machinery/status_display/ai{ pixel_x = 32 @@ -59,15 +62,12 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bi" = ( @@ -80,13 +80,32 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"br" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/modular_computer/console/preset/netmin, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "bs" = ( /obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "bI" = ( @@ -110,6 +129,7 @@ /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) "bY" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "ci" = ( @@ -122,43 +142,20 @@ /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/ai) "cn" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, /obj/machinery/door/airlock/hatch{ name = "MiniSat Teleporter Room"; req_one_access_txt = "17;65" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) -"cz" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"cE" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "cH" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -168,8 +165,8 @@ dir = 5; network = list("ss13","tcomms") }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) @@ -185,57 +182,30 @@ pixel_x = -32; pixel_y = 0 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, /obj/machinery/computer/shuttle/ai_ship{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) -"cP" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) -"cW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) -"dG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 6 +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 10 }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "dL" = ( /obj/structure/lattice, /turf/open/space/basic, /area/solar/port/aft) "dQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "dW" = ( @@ -266,6 +236,20 @@ }, /turf/open/floor/plating, /area/tcommsat/computer) +"ew" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "ez" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -273,13 +257,19 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "eW" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "fa" = ( @@ -290,9 +280,6 @@ /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) "fg" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line, /obj/machinery/airalarm{ dir = 4; @@ -306,29 +293,11 @@ dir = 4; network = list("ss13","minisat") }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) -"fl" = ( -/obj/machinery/door/airlock/highsecurity{ - id_tag = "ai_core_airlock_exterior"; - name = "AI Core"; - req_access_txt = "16" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 }, /turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) +/area/ai_monitored/turret_protected/aisat_interior) "fq" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /turf/open/floor/plating, @@ -338,6 +307,9 @@ dir = 4 }, /obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "fw" = ( @@ -348,17 +320,17 @@ /turf/open/space/basic, /area/solar/port/aft) "fF" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "fG" = ( @@ -366,20 +338,26 @@ dir = 8 }, /obj/machinery/rack_creator, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "fK" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "fS" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -473,6 +451,9 @@ /obj/item/stock_parts/subspace/treatment, /obj/item/stock_parts/subspace/treatment, /obj/item/stock_parts/subspace/treatment, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "ir" = ( @@ -484,13 +465,56 @@ }, /turf/open/space/basic, /area/ai_monitored/turret_protected/ai) +"ix" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "iD" = ( /obj/machinery/light, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 10 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"ja" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) +"jc" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "jn" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -504,17 +528,33 @@ /obj/machinery/telecomms/bus/preset_four, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) -"jN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ +"jw" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower, /turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) +/area/tcommsat/server) "jR" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"jT" = ( +/obj/structure/ethernet_cable{ + icon_state = "0-2" + }, +/obj/machinery/ai/networking{ + label = "Computer Science - 2"; + roundstart_connection = "Subcontroller" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "jY" = ( /obj/machinery/telecomms/broadcaster/preset_right, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -578,29 +618,33 @@ /obj/machinery/firealarm{ pixel_y = 26 }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) -"kY" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/ai_monitored/turret_protected/ai) -"la" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" +"kM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable/yellow{ - icon_state = "1-8" + icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) +"kY" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/ai_monitored/turret_protected/ai) "lk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -613,6 +657,19 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) +"lm" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/line/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "ln" = ( /obj/effect/landmark/carpspawn, /turf/open/space/basic, @@ -623,14 +680,6 @@ }, /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) -"lp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "ly" = ( /obj/structure/cable/white{ icon_state = "2-4" @@ -639,7 +688,7 @@ /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) "lA" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 10 }, /turf/open/floor/plasteel/dark, @@ -680,6 +729,10 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "mb" = ( @@ -700,6 +753,9 @@ /obj/structure/rack, /obj/item/tank/internals/emergency_oxygen, /obj/item/clothing/gloves/color/black, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "mB" = ( @@ -713,8 +769,27 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/secred/filled/line/lower, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"mK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "nj" = ( /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/tcommsat/server"; @@ -725,13 +800,22 @@ /obj/structure/cable{ icon_state = "0-2" }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "nk" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "nB" = ( @@ -741,6 +825,15 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "oa" = ( @@ -776,7 +869,7 @@ /turf/open/space/basic, /area/ai_monitored/turret_protected/ai) "oH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 9 }, /turf/open/floor/plasteel/dark, @@ -811,6 +904,9 @@ pixel_x = -28 }, /obj/machinery/rnd/production/circuit_imprinter/department/netmin, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "pK" = ( @@ -820,6 +916,30 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/solar/port/aft) +"pP" = ( +/obj/machinery/door/airlock/highsecurity{ + id_tag = "ai_core_airlock_exterior"; + name = "AI Core"; + req_access_txt = "16" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "pQ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 @@ -830,10 +950,10 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/landmark/start/cyborg, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, -/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "pW" = ( @@ -849,9 +969,18 @@ }, /turf/open/space/basic, /area/solar/port/aft) -"qf" = ( -/obj/machinery/status_display/ai_core, -/turf/open/floor/circuit/telecomms/server, +"qd" = ( +/obj/machinery/holopad, +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/ai) "rm" = ( /obj/machinery/power/terminal{ @@ -860,6 +989,12 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "rr" = ( @@ -886,6 +1021,18 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/aisat_interior) +"rv" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "rE" = ( /turf/closed/wall, /area/ai_monitored/turret_protected/aisat_interior) @@ -938,10 +1085,6 @@ /turf/closed/wall/r_wall, /area/ai_monitored/storage/satellite) "sM" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, @@ -951,9 +1094,13 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "tc" = ( @@ -961,6 +1108,12 @@ dir = 1; pixel_y = -24 }, +/obj/effect/turf_decal/trimline/white/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "td" = ( @@ -986,6 +1139,12 @@ /area/tcommsat/server) "tW" = ( /obj/machinery/atmospherics/pipe/simple/yellow/hidden, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "tY" = ( @@ -993,13 +1152,13 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) "us" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/machinery/light{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "uP" = ( @@ -1009,22 +1168,6 @@ }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) -"uS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "uV" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -1064,6 +1207,13 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "vi" = ( @@ -1075,10 +1225,10 @@ /obj/machinery/light{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 9 }, -/obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "vJ" = ( @@ -1099,14 +1249,27 @@ /turf/open/floor/circuit/green/telecomms, /area/ai_monitored/turret_protected/ai) "vN" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"wa" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "wE" = ( /obj/machinery/telecomms/processor/preset_three, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -1155,7 +1318,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -1167,12 +1330,20 @@ /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ dir = 5 }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "xW" = ( /obj/structure/chair/office{ dir = 1 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "yh" = ( @@ -1182,6 +1353,13 @@ /obj/structure/cable/yellow{ icon_state = "1-4" }, +/obj/effect/turf_decal/trimline/secred/filled/corner/lower, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "yl" = ( @@ -1197,14 +1375,14 @@ /turf/open/space/basic, /area/ai_monitored/turret_protected/ai) "ys" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "yu" = ( @@ -1212,12 +1390,18 @@ /turf/open/space/basic, /area/space/nearstation) "yy" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 6 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "yJ" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "yO" = ( @@ -1229,6 +1413,9 @@ pixel_y = 28 }, /obj/machinery/modular_computer/console/preset/tcomms, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "yZ" = ( @@ -1247,16 +1434,41 @@ }, /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) -"zw" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 +"zk" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Monitoring Room"; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) +"zp" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) +"zw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "zH" = ( @@ -1269,7 +1481,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -1281,8 +1493,19 @@ /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ dir = 4 }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"zW" = ( +/obj/machinery/status_display/ai_core, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "Ab" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -1304,13 +1527,33 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/ai) +"Am" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "AF" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -1320,9 +1563,21 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) "AP" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"AS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 6 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "AU" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -1338,6 +1593,9 @@ /obj/machinery/computer/telecomms/server{ network = "tcommsat" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "Bo" = ( @@ -1355,6 +1613,9 @@ pixel_y = -24 }, /obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "Bs" = ( @@ -1368,6 +1629,10 @@ }, /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) +"Bv" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/ai_monitored/storage/satellite) "Bz" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -1379,6 +1644,13 @@ /obj/machinery/telecomms/processor/preset_four, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) +"BY" = ( +/obj/machinery/ai/server_cabinet/prefilled, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "Co" = ( /obj/machinery/light/small{ dir = 8 @@ -1388,9 +1660,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) -"Cr" = ( -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "Ct" = ( /obj/effect/turf_decal/stripes/corner, /obj/machinery/doorButtons/airlock_controller{ @@ -1427,15 +1696,24 @@ /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ dir = 10 }, +/obj/effect/turf_decal/trimline/green/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "Da" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Dh" = ( @@ -1445,6 +1723,16 @@ }, /turf/open/floor/circuit/green/telecomms, /area/ai_monitored/turret_protected/ai) +"DA" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden, +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "Eg" = ( /obj/machinery/computer/teleporter{ dir = 1 @@ -1464,6 +1752,10 @@ name = "Station Intercom (Telecomms)"; pixel_x = 28 }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "EH" = ( @@ -1478,34 +1770,34 @@ dir = 2; dwidth = 2; height = 6; - shuttle_id = "ai_ship"; name = "ai ship bay"; + shuttle_id = "ai_ship"; width = 5 }, /turf/open/space/basic, /area/space) "FQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "FW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ dir = 9 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "Go" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Gr" = ( @@ -1527,23 +1819,12 @@ /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) "Gu" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) -"GG" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Hd" = ( @@ -1552,15 +1833,15 @@ external_pressure_bound = 120; name = "server vent" }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "Ho" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, @@ -1570,6 +1851,12 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Hw" = ( @@ -1600,19 +1887,23 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "HK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "HP" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Im" = ( @@ -1644,6 +1935,15 @@ "Je" = ( /turf/open/space/basic, /area/space) +"Jj" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "Jk" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -1653,7 +1953,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -1671,12 +1971,9 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) -"Kk" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "Kt" = ( /obj/machinery/door/airlock/external{ name = "MiniSat External Access"; @@ -1700,26 +1997,26 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) "KY" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Lb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/stripes/corner{ +/mob/living/simple_animal/pet/axolotl/bop, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 }, -/mob/living/simple_animal/pet/axolotl/bop, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "Lc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Lj" = ( @@ -1734,10 +2031,6 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Lm" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/door/airlock/hatch{ name = "MiniSat Antechamber"; req_access_txt = "65" @@ -1751,6 +2044,10 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/aisat_interior) "Lt" = ( @@ -1767,6 +2064,7 @@ name = "AI Ship Solar Controller" }, /obj/structure/cable, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "Md" = ( @@ -1786,6 +2084,9 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 4 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "Mr" = ( @@ -1795,6 +2096,7 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 35 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "ME" = ( @@ -1808,7 +2110,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/trimline/engiyellow/warning/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -1825,9 +2127,6 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Np" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -1839,6 +2138,9 @@ name = "Station Intercom (General)"; pixel_x = 26 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Ns" = ( @@ -1849,24 +2151,6 @@ }, /turf/open/space/basic, /area/ai_monitored/turret_protected/aisat_interior) -"ND" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/aisat_interior) "NK" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -1906,16 +2190,22 @@ /obj/machinery/atmospherics/pipe/manifold/yellow/hidden{ dir = 8 }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "Ow" = ( /obj/machinery/announcement_system, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "Ox" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, /obj/machinery/flasher{ id = "AI"; pixel_x = 24; @@ -1926,9 +2216,12 @@ dir = 8; network = list("minisat","ss13") }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "OB" = ( @@ -1960,12 +2253,31 @@ "OW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Pd" = ( /turf/closed/wall, /area/tcommsat/computer) +"Pe" = ( +/obj/machinery/door/airlock/public{ + id_tag = "ai_core_airlock_interior" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "Pg" = ( /obj/machinery/telecomms/hub/preset, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -2017,13 +2329,29 @@ dir = 1; network = "tcommsat" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) +"Qp" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "QG" = ( /obj/machinery/light/small{ dir = 1 }, /obj/machinery/computer/message_monitor, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "QL" = ( @@ -2053,12 +2381,12 @@ /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "Rg" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, /obj/machinery/status_display/ai{ pixel_y = 32 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "RI" = ( @@ -2078,12 +2406,23 @@ network = list("minisat","ss13"); start_active = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) -"RL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +"RK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 1; + external_pressure_bound = 120; + name = "server vent" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-4" }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) +"RL" = ( /obj/machinery/airalarm{ pixel_y = 24 }, @@ -2091,6 +2430,9 @@ /obj/machinery/light{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "RM" = ( @@ -2102,15 +2444,13 @@ }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) -"Sh" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Monitoring Room"; - req_access_txt = "65" +"Sj" = ( +/obj/machinery/ai/data_core/primary, +/obj/structure/ethernet_cable{ + icon_state = "0-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "Sk" = ( /obj/machinery/telecomms/processor/preset_one, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -2122,12 +2462,12 @@ /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "SF" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "SN" = ( @@ -2143,8 +2483,32 @@ /obj/machinery/atmospherics/pipe/manifold/yellow/hidden{ dir = 4 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) +"SZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat_interior) "Tb" = ( /obj/structure/window/reinforced{ dir = 4 @@ -2158,15 +2522,6 @@ }, /turf/open/floor/circuit/green/telecomms, /area/ai_monitored/turret_protected/ai) -"Tj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) -"Tu" = ( -/obj/machinery/ai/data_core/primary, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "Tv" = ( /obj/machinery/telecomms/server/presets/security, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -2187,30 +2542,23 @@ pixel_x = 28; pixel_y = -26 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "TC" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_x = 32 }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) -"TS" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 }, -/obj/machinery/computer/ai_control_console{ - dir = 8 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 }, -/turf/open/floor/plasteel/grimy, +/turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "Um" = ( /obj/machinery/power/terminal{ @@ -2234,6 +2582,9 @@ /obj/item/stock_parts/subspace/ansible, /obj/item/stock_parts/subspace/ansible, /obj/item/stock_parts/subspace/ansible, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "UA" = ( @@ -2250,7 +2601,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/trimline/engiyellow/warning/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -2259,6 +2610,9 @@ /obj/machinery/computer/ai_overclocking{ dir = 8 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "UL" = ( @@ -2273,8 +2627,19 @@ /obj/item/stock_parts/subspace/amplifier, /obj/item/stock_parts/subspace/amplifier, /obj/item/stock_parts/subspace/amplifier, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) +"UV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "UW" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -2293,6 +2658,10 @@ name = "MiniSat Maintenance"; req_access_txt = "65" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "Vm" = ( @@ -2339,10 +2708,16 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/green/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "WX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -2388,6 +2763,16 @@ }, /turf/open/floor/plating, /area/tcommsat/server) +"Xn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "Xw" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -2421,27 +2806,11 @@ "XF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"XM" = ( -/obj/machinery/door/airlock/public{ - id_tag = "ai_core_airlock_interior" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "XN" = ( /obj/structure/frame/machine, /turf/open/floor/circuit/green/telecomms, @@ -2457,18 +2826,20 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) "Yo" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"Ys" = ( -/obj/machinery/ai/server_cabinet/prefilled, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "YZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "Zd" = ( @@ -2494,7 +2865,7 @@ /turf/open/space/basic, /area/ai_monitored/turret_protected/ai) "Zq" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -2504,11 +2875,11 @@ /turf/open/floor/circuit, /area/ai_monitored/turret_protected/aisat_interior) "ZV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, /obj/structure/rack, /obj/item/storage/toolbox/mechanical, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "ZX" = ( @@ -3237,11 +3608,11 @@ Je EH yl YZ -tW +jc xS rm yh -tW +DA ez yl jR @@ -3308,9 +3679,9 @@ EH yl bI tI -zR +lm Wx -mE +wa hz tn yl @@ -3379,7 +3750,7 @@ yl wE jY KN -mE +jw mB AI Sk @@ -3412,7 +3783,7 @@ Je EH yl kL -tW +Qp Ou bi El @@ -3800,7 +4171,7 @@ lk ys OW QL -nk +zp fq yu jR @@ -3900,7 +4271,7 @@ jR yO hc mb -mb +Bv Vc SF AP @@ -4079,11 +4450,11 @@ JQ lN fF AF -la -GG -cz -Sh -Tj +Am +ew +ix +zk +UV oA Qi Qi @@ -4114,11 +4485,11 @@ RI pD bb Ct -ND +SZ NK uZ rE -TS +br aA Qi jR @@ -4149,7 +4520,7 @@ OM OM PH PH -fl +pP PH PH Qi @@ -4184,7 +4555,7 @@ kY kY PH XB -uS +ja Ph PH kY @@ -4219,7 +4590,7 @@ kY PH PH PH -XM +Pe PH PH PH @@ -4254,7 +4625,7 @@ PH PH gh lo -cW +kM VJ OB PH @@ -4289,7 +4660,7 @@ PH Tb ig KM -cE +mK td Xw mj @@ -4321,10 +4692,10 @@ jR PH kY PH -Ys -dG +jT +AS uV -qf +zW bV rr XN @@ -4357,12 +4728,12 @@ PH kY PH Dh -jN -cP -Kk -Cr -xn -lp +Xn +Jj +qd +aY +rv +RK PH kY PH @@ -4394,10 +4765,10 @@ PH XN ci jn -Tu +Sj ly oW -Ys +BY PH kY PH diff --git a/_maps/RandomRuins/StationRuins/MetaStation/meta_teg.dmm b/_maps/RandomRuins/StationRuins/MetaStation/meta_teg.dmm index 1cd87738cead..df5bd9f0eb6c 100644 --- a/_maps/RandomRuins/StationRuins/MetaStation/meta_teg.dmm +++ b/_maps/RandomRuins/StationRuins/MetaStation/meta_teg.dmm @@ -167,6 +167,18 @@ }, /turf/open/floor/engine/airless, /area/engine/engineering) +"gA" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) "gK" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -427,6 +439,17 @@ /obj/structure/lattice/catwalk, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/space/nearstation) +"oP" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/advanced_airlock_controller/lavaland{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plating, +/area/engine/engineering) "oZ" = ( /obj/machinery/bounty_board, /turf/closed/wall/r_wall, @@ -617,6 +640,13 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"wj" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector{ + dir = 8; + id = "teghot_in" + }, +/turf/open/floor/engine/airless, +/area/engine/engineering) "wu" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ dir = 1 @@ -668,17 +698,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"yP" = ( -/obj/machinery/advanced_airlock_controller{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/closet/emcloset/anchored, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "yS" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -736,12 +755,6 @@ /obj/machinery/atmospherics/pipe/manifold/dark/visible, /turf/open/floor/engine, /area/engine/engineering) -"Az" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/engine/engineering) "AW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -854,12 +867,6 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, /area/engine/engineering) -"FQ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector{ - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/engine/engineering) "Gm" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -1032,24 +1039,6 @@ /obj/structure/lattice, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/space/nearstation) -"Md" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "Ms" = ( /obj/effect/mapping_helpers/teleport_anchor, /obj/effect/turf_decal/stripes/line{ @@ -1136,17 +1125,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"Pu" = ( -/obj/structure/closet/emcloset/anchored, -/obj/machinery/advanced_airlock_controller{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engine/engineering) "PC" = ( /obj/machinery/igniter{ id = "teghotburn"; @@ -1380,6 +1358,13 @@ "Vz" = ( /turf/open/floor/engine, /area/engine/engineering) +"VP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos{ + dir = 8; + id_tag = "teghot_out" + }, +/turf/open/floor/engine/airless, +/area/engine/engineering) "VQ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -1640,7 +1625,7 @@ xR xR "} (5,1,1) = {" -Md +gA xR aF pN @@ -1692,7 +1677,7 @@ xR xR "} (7,1,1) = {" -Pu +oP ib Tl Mb @@ -1970,7 +1955,7 @@ UH Mb Tl Yg -yP +oP Tl xR xR @@ -2040,9 +2025,9 @@ Mb lU Xo PC -FQ +wj fU -Az +VP PC nK lU diff --git a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_tank_heaven.dmm b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_tank_heaven.dmm index 4cee06dfba39..c3ee73697e5a 100644 --- a/_maps/RandomRuins/StationRuins/maint/10x5/10x5_tank_heaven.dmm +++ b/_maps/RandomRuins/StationRuins/maint/10x5/10x5_tank_heaven.dmm @@ -55,7 +55,7 @@ /turf/open/floor/plating, /area/template_noop) "p" = ( -/obj/structure/mecha_wreckage/ripley/mkii, +/obj/structure/mecha_wreckage/ripley/firefighter, /obj/effect/decal/cleanable/oil, /turf/open/floor/plating, /area/template_noop) diff --git a/_maps/RandomZLevels/VR/netmin_hub.dmm b/_maps/RandomZLevels/VR/netmin_hub.dmm new file mode 100644 index 000000000000..c07991846b99 --- /dev/null +++ b/_maps/RandomZLevels/VR/netmin_hub.dmm @@ -0,0 +1,72096 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen{ + pixel_y = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"ac" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/obj/item/crowbar, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"ae" = ( +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"ag" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/scientist_raid) +"ai" = ( +/turf/closed/wall/mineral/titanium, +/area/awaymission/vr/hub) +"am" = ( +/obj/item/stack/ore/iron, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"an" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ao" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/table, +/obj/item/melee/baton/cattleprod, +/obj/item/electropack, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"ap" = ( +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"aq" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"ar" = ( +/obj/structure/table, +/obj/structure/table, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"ax" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"az" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"aA" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"aE" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"aJ" = ( +/obj/structure/showcase/cyborg{ + desc = "A stand with a deactivated combat robot attached. This seems to be an earlier model. Weren't these made illegal a long time ago?"; + name = "ancient robot showcase" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"aM" = ( +/obj/machinery/door/poddoor{ + id = "nothing"; + name = "supply dock loading door" + }, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"aV" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"aW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/bed, +/obj/item/bedsheet/centcom, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"aY" = ( +/obj/structure/closet/l3closet/janitor, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"bc" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"bf" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/scalpel, +/obj/item/paper/fluff/awaymissions/scientist_raid/report4, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"bk" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"bn" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, +/obj/machinery/button_puzzle{ + id = "mine_button"; + pixel_x = -23; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"bo" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/carpet/royalblue, +/area/awaymission/vr/combat_robot_factory) +"bq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"br" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"bt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"bu" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/table, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"bv" = ( +/obj/machinery/door/airlock/command{ + name = "Personal Quarters" + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"bx" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"by" = ( +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"bA" = ( +/obj/effect/landmark/vr_spawn/vr_mission/abandoned_mine, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"bD" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 5 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"bG" = ( +/obj/item/flashlight/lantern, +/turf/open/floor/plating, +/area/awaymission/vr/abandoned_mine) +"bH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"bI" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/table/glass, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/storage/firstaid/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"bP" = ( +/turf/open/floor/plating, +/area/awaymission/vr/hub) +"bQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"bS" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/bottle/cognac, +/obj/item/storage/secure/safe/scientist_raid{ + pixel_x = 32 + }, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"bU" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"bX" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/item/paper/fluff/awaymissions/robot_factory/classified, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"bY" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"cl" = ( +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"cn" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"co" = ( +/obj/machinery/door/airlock/science{ + name = "Experimental Computer Science" + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"cu" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"cD" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"cJ" = ( +/obj/structure/table/wood, +/obj/item/storage/box/matches{ + pixel_x = -5; + pixel_y = 13 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/combat_robot_factory) +"cO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"cS" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"cU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/combat_robot_factory) +"cX" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/obj/machinery/button_puzzle{ + id = "mine_button"; + pixel_x = -23; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"cY" = ( +/obj/item/chair/stool, +/obj/effect/decal/cleanable/blood, +/obj/structure/spider/cocoon, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"cZ" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"db" = ( +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"de" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"df" = ( +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = -9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"dh" = ( +/obj/machinery/door/airlock/medical{ + name = "Experimental Development" + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"dj" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/awaymission/vr/abandoned_mine) +"dm" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"dn" = ( +/mob/living/simple_animal/hostile/boss/robot_leader{ + del_on_death = 1; + loot = list(/obj/effect/decal/cleanable/robot_debris,/obj/item/paper/fluff/awaymissions/robot_factory/diagnostic,/obj/item/ai_cpu/self_aware) + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"do" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"dp" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11; + pixel_y = 1 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"dq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"dw" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"dB" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/scientist_raid) +"dC" = ( +/obj/effect/decal/cleanable/blood/footprints, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"dD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/vending/cola/random, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"dE" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck{ + pixel_x = 7 + }, +/obj/item/stack/spacecash/c200{ + pixel_x = -3; + pixel_y = 10 + }, +/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag{ + pixel_x = -4; + pixel_y = -5 + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"dJ" = ( +/obj/machinery/door/window/brigdoor/security/holding/westleft, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"dS" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"dT" = ( +/obj/effect/decal/remains/human, +/obj/effect/gibspawner/human, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"dZ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"ee" = ( +/obj/item/disk/puzzle{ + id = "mine_floppy" + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"ef" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/computer{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/awaymissions/robot_factory/control_message, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"ei" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"ej" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"el" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"en" = ( +/obj/machinery/door/airlock{ + name = "Living Quarters" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"er" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"ew" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/shuttle/engine/heater{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/awaymission/vr/hub) +"ex" = ( +/obj/machinery/door/airlock{ + name = "Personal Quarters" + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"eA" = ( +/obj/structure/closet/crate, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"eB" = ( +/obj/machinery/door/window/southright, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/mob_spawn/human/corpse, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"eE" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"eF" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"eH" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"eI" = ( +/obj/item/gem/fdiamond, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"eJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"eQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 9 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/metal/ten, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"eR" = ( +/obj/effect/decal/cleanable/robot_debris/gib, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"eU" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"eW" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fb" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fc" = ( +/obj/item/disk/puzzle{ + id = "mine_armory" + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"fd" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"ff" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"fg" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"fi" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fk" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"fp" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/fireaxe, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"fq" = ( +/obj/structure/table/reinforced, +/obj/item/wrench, +/obj/item/paper/fluff/awaymissions/robot_factory/shipment_details, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fr" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"fu" = ( +/obj/effect/mob_spawn/human/corpse/assistant, +/obj/machinery/light, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"fv" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"fE" = ( +/obj/item/shield/riot, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"fG" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate, +/obj/item/storage/backpack, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fL" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"fN" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"fR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"fU" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/awaymission/vr/scientist_raid) +"fX" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"gb" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"gc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"gf" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/fluff/empty_sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"gi" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/delivery, +/mob/living/simple_animal/hostile/robot/burst, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"gn" = ( +/obj/machinery/door/window/southright, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"gp" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"gw" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 9 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/storage/box/lethalshot, +/obj/item/storage/box/lethalshot, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"gx" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/melee/baton/loaded, +/obj/item/disk/holodisk/combat_robot/factory_floor, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"gz" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/item/ammo_casing/n762{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = -9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"gC" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"gH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"gK" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 11; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"gM" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"gQ" = ( +/obj/machinery/papershredder, +/obj/item/shreddedpaper, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"gS" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"gT" = ( +/obj/machinery/door/airlock{ + name = "Supervisors's Quarters" + }, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"gU" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"gY" = ( +/obj/structure/sign/poster/official/anti_self{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"gZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/obj/machinery/suit_storage_unit/open, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"hc" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"hm" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"hn" = ( +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"hq" = ( +/obj/effect/decal/cleanable/blood, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"hr" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ht" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"hu" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/table/glass, +/obj/item/storage/firstaid/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/storage/firstaid/toxin, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"hy" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"hz" = ( +/mob/living/simple_animal/hostile/robot{ + AIStatus = 3 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"hB" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/closet, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/shoes/sneakers/orange, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"hC" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"hE" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"hF" = ( +/obj/effect/spawner/structure/window/reinforced/indestructable, +/turf/open/floor/plating, +/area/awaymission/vr/abandoned_mine) +"hH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"hM" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"hO" = ( +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"hS" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"hU" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"hV" = ( +/obj/machinery/door/airlock/mining{ + name = "Shipping" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"hZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ia" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ij" = ( +/mob/living/simple_animal/hostile/robot/advanced/ranged, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"ik" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 10 + }, +/obj/structure/guncase/shotgun, +/obj/item/gun/ballistic/shotgun/doublebarrel/lethal, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"in" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"iv" = ( +/obj/effect/decal/cleanable/blood/footprints, +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"iw" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"iy" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"iB" = ( +/obj/structure/curtain, +/obj/machinery/shower, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"iD" = ( +/obj/machinery/door/airlock{ + name = "Personal Quarters" + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"iH" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/ai_cpu/advanced, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"iJ" = ( +/turf/open/floor/plating, +/area/awaymission/vr/abandoned_mine) +"iM" = ( +/obj/structure/shuttle/engine/propulsion/burst/right, +/turf/open/floor/plating/airless, +/area/awaymission/vr/scientist_raid) +"iN" = ( +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"iP" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/machinery/button_puzzle{ + id = "mine_button"; + pixel_x = 24; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"iQ" = ( +/obj/structure/bed, +/obj/item/bedsheet/centcom, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/disk/puzzle{ + id = "corporate_dorm" + }, +/turf/open/floor/wood/broken/seven, +/area/awaymission/vr/combat_robot_factory) +"iS" = ( +/obj/structure/table/wood, +/obj/item/book, +/obj/item/paper/fluff/awaymissions/robot_factory/advanced_model, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"iU" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"iZ" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/titanium, +/turf/open/floor/plating, +/area/awaymission/vr/scientist_raid) +"jb" = ( +/turf/closed/indestructible/riveted, +/area/awaymission/vr/abandoned_mine) +"jg" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ji" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/fluff/empty_sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"jj" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"jn" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/structure/closet, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/shoes/sneakers/orange, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"jr" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"jt" = ( +/obj/machinery/light, +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ju" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"jx" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"jy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"jz" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"jA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"jB" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/table, +/obj/item/reagent_containers/syringe{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/restraints/handcuffs{ + pixel_x = -1; + pixel_y = 7 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"jD" = ( +/turf/closed/indestructible/rock, +/area/awaymission/vr/abandoned_mine) +"jE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"jG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"jO" = ( +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"jT" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"ka" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"kg" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"kl" = ( +/obj/effect/landmark/vr_spawn/vr_mission/scientist_raid, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/scientist_raid) +"km" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/mob_spawn/human/corpse/syndicatesoldier, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"ko" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"kp" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/awaymission/vr/hub) +"kq" = ( +/obj/effect/spawner/structure/window/reinforced/shutter, +/obj/machinery/door/poddoor, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"ks" = ( +/mob/living/simple_animal/hostile/robot, +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"kv" = ( +/obj/machinery/autolathe{ + name = "main processing assembly" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"kA" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"kD" = ( +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"kI" = ( +/obj/item/bedsheet, +/obj/structure/bed, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"kJ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"kR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"kT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/rack, +/obj/item/card/id/away{ + desc = "An identification permitting access to all sections of corporate factories"; + icon_state = "centcom"; + name = "corporate ID card" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"kW" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/clothing/suit/armor/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/suit/armor/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/head/helmet/riot, +/obj/item/clothing/head/helmet/riot{ + pixel_x = 2; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"lk" = ( +/obj/machinery/computer/operating, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"lr" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"ls" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"lF" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"lG" = ( +/obj/structure/sign/poster/official/do_not_question{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"lI" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 9 + }, +/obj/structure/rack, +/obj/item/storage/box/lethalshot, +/obj/item/storage/box/lethalshot, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"lL" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/obj/item/paper/fluff/awaymissions/robot_factory/spider, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"lR" = ( +/turf/open/space/basic, +/area/awaymission/vr/scientist_raid) +"lU" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"lV" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"ma" = ( +/obj/machinery/door/airlock/engineering{ + name = "Quality Assurance" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"mc" = ( +/obj/machinery/door/airlock/medical{ + name = "Discarded Research" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"me" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"mf" = ( +/obj/structure/bed, +/obj/item/bedsheet/ian, +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"mj" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"ml" = ( +/obj/structure/kitchenspike, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"mo" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"mp" = ( +/obj/effect/spawner/structure/window/reinforced/shutter, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"mq" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"mv" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"my" = ( +/turf/closed/indestructible/riveted, +/area/awaymission/vr/hub) +"mC" = ( +/obj/machinery/door/airlock{ + name = "Personal Quarters" + }, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"mE" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"mG" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"mI" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"mL" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"mO" = ( +/obj/structure/table/glass, +/obj/item/folder/white, +/turf/open/floor/carpet/royalblue, +/area/awaymission/vr/combat_robot_factory) +"mP" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"mQ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"mT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"mU" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"mW" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"mX" = ( +/obj/item/bedsheet, +/obj/structure/bed, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"nc" = ( +/obj/machinery/autolathe{ + name = "tool mounting" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"nj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small, +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"nq" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets/donkpocketpizza, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"nw" = ( +/obj/structure/curtain, +/obj/machinery/shower, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"ny" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"nD" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/table, +/obj/item/restraints/handcuffs/cable/red{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/restraints/handcuffs/cable/red{ + pixel_x = 1; + pixel_y = -1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"nF" = ( +/turf/closed/indestructible/riveted, +/area/awaymission/vr/scientist_raid) +"nH" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"nI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"nK" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"nN" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"nS" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/bed/dogbed{ + name = "cat bed" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/vr/combat_robot_factory) +"nY" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"oa" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/decal/cleanable/blood, +/obj/machinery/light/broken, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"ob" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"of" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"oi" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/cargo_tech, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"oj" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"om" = ( +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"oq" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/awaymission/vr/hub) +"ot" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"oE" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"oG" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"oH" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"oJ" = ( +/mob/living/simple_animal/hostile/poison/giant_spider, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"oK" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"oM" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"oP" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"oR" = ( +/obj/structure/table, +/obj/item/ai_cpu, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"oT" = ( +/turf/closed/wall, +/area/awaymission/vr/scientist_raid) +"oU" = ( +/mob/living/simple_animal/hostile/retaliate/clown/mutant/blob{ + loot = list(/obj/item/clothing/mask/gas/clown_hat,/obj/effect/gibspawner/xeno/bodypartless,/obj/effect/particle_effect/fluid/foam,/obj/item/soap,/obj/effect/gibspawner/generic,/obj/effect/gibspawner/generic/animal,/obj/effect/gibspawner/human/bodypartless,/obj/effect/gibspawner/human,/obj/item/holo/esword) + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"pc" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/bed, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"pe" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"pg" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"ph" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"pk" = ( +/obj/machinery/door/poddoor{ + id = "nothing"; + name = "programming access" + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"pn" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"pt" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"pv" = ( +/obj/effect/decal/remains/human, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"pw" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/metal/ten, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"py" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"pA" = ( +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"pF" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/metal/five, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"pJ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"pK" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"pL" = ( +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"pO" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/structure/table, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"pU" = ( +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"pV" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"pZ" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"qd" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"qf" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"qh" = ( +/obj/machinery/door/airlock{ + name = "Personal Quarters" + }, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"qi" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"qj" = ( +/turf/closed/wall, +/area/awaymission/vr/combat_robot_factory) +"qk" = ( +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"qp" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"qq" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"qs" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"qz" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"qI" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"qK" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"qL" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"qP" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"qT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"ra" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"rb" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 5 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"rd" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"re" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"rf" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/structure/table, +/obj/item/ai_cpu, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"rg" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"rh" = ( +/obj/item/grenade/flashbang{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"rj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"rk" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/machinery/light, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"rs" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"ru" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"rw" = ( +/obj/structure/sign/poster/official/random, +/turf/closed/wall, +/area/awaymission/vr/scientist_raid) +"rE" = ( +/obj/machinery/light, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"rG" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"rH" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"rJ" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"rN" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"rO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"rQ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"rS" = ( +/obj/machinery/computer{ + dir = 4; + name = "communications computer" + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"rT" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"rZ" = ( +/mob/living/simple_animal/hostile/robot/range, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"sb" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"sd" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"sg" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/table/reinforced, +/obj/item/melee/baton/loaded, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"sm" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen{ + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"sq" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/obj/machinery/button_puzzle{ + id = "mine_button"; + pixel_x = -23; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"sx" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/metal/ten, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"sC" = ( +/mob/living/simple_animal/hostile/robot, +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"sD" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/door/window/southright, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"sF" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"sH" = ( +/obj/machinery/door/password{ + name = "Emergency Supplies"; + password = "Benny"; + voice_activated = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"sL" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"sO" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Sickbay" + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"sQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 6 + }, +/obj/structure/table, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"sU" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"sW" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"tc" = ( +/obj/item/ammo_casing/n762{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"tf" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"th" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"tj" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/scalpel, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"tz" = ( +/obj/machinery/door/password/button_puzzle{ + id = "mine_button" + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"tA" = ( +/obj/machinery/door/airlock/security{ + name = "Cell 1" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"tB" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/robot_debris, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"tC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"tK" = ( +/obj/machinery/door/password/floppy_disk{ + id = "mine_floppy"; + name = "Command Centre" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"tL" = ( +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"tO" = ( +/obj/structure/closet, +/obj/item/paper/crumpled/bloody/fluff/awaymissions/scientist_raid/report5, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"tP" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"tQ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/medicine{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"tW" = ( +/turf/closed/indestructible/fakedoor{ + name = "Uplink Access" + }, +/area/awaymission/vr/abandoned_mine) +"tX" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"tZ" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ua" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ud" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"ue" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/obj/machinery/door/airlock/mining{ + name = "Storage" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"uf" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/airless, +/area/awaymission/vr/scientist_raid) +"ui" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/wood/broken/four, +/area/awaymission/vr/combat_robot_factory) +"um" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"un" = ( +/obj/machinery/door/airlock/security{ + name = "Organic Storage" + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"up" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/mine_contract{ + pixel_x = 7; + pixel_y = -1 + }, +/obj/item/storage/firstaid{ + pixel_x = -7; + pixel_y = -1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ut" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/awaymissions/robot_factory/benny, +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"uz" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"uB" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"uC" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"uF" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"uG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"uI" = ( +/obj/effect/decal/cleanable/blood/gibs, +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"uK" = ( +/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"uT" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"uV" = ( +/obj/machinery/vending/snack/random, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"uZ" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"vb" = ( +/obj/structure/table, +/obj/item/wrench, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"vh" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"vj" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"vk" = ( +/obj/machinery/anesthetic_machine/roundstart, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"vl" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"vn" = ( +/obj/structure/table/wood, +/obj/item/storage/pill_bottle/dice, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"vp" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/scientist_raid) +"vq" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"vr" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"vt" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Corporate Liason Office" + }, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"vu" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/scientist_raid) +"vy" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"vD" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"vF" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 6 + }, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"vH" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "crew maintenance compartment" + }, +/turf/open/floor/plating, +/area/awaymission/vr/hub) +"vP" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"vQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/machinery/ai/server_cabinet, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"vT" = ( +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"vV" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"vW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/table, +/obj/item/clothing/glasses/hud/health{ + pixel_x = 1 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_x = 7; + pixel_y = -5 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"vY" = ( +/obj/machinery/compsci_reciever, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"vZ" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"wa" = ( +/obj/machinery/door/airlock/mining{ + name = "Cargo" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"wh" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"wi" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"wk" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/paper/fluff/awaymissions/button_puzzle{ + id = "mine_button"; + pixel_x = -9; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"wm" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/cable_coil/random/thirty, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ws" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"wy" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "????"; + req_access_txt = "0" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"wB" = ( +/obj/structure/showcase/mecha/ripley{ + desc = "A stand with an experimental exploration mech attached. These were used by human exploration crews before the Corporation realized robots could do the job."; + name = "experimental exploration mech" + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"wJ" = ( +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"wL" = ( +/obj/effect/decal/cleanable/robot_debris, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"wO" = ( +/obj/structure/window/reinforced, +/turf/open/floor/wood/broken/six, +/area/awaymission/vr/combat_robot_factory) +"wP" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"wQ" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"xa" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"xd" = ( +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"xg" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 5 + }, +/obj/structure/rack, +/obj/item/clothing/suit/armor/vest, +/obj/item/clothing/suit/armor/vest, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"xh" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"xl" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"xm" = ( +/mob/living/simple_animal/hostile/robot, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"xp" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 11; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/blood/drip, +/obj/item/ammo_casing/n762{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"xr" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"xs" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Room" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"xu" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"xw" = ( +/obj/machinery/door/airlock/mining{ + name = "Storage Room" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"xx" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"xE" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"xJ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"xK" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"xP" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"xU" = ( +/obj/structure/closet/crate, +/obj/item/flashlight, +/obj/item/flashlight, +/obj/item/weldingtool, +/obj/item/flashlight/flare, +/obj/item/flashlight/flare, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"xY" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"ya" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating/airless, +/area/awaymission/vr/hub) +"yf" = ( +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = 10; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = 10; + pixel_y = 16 + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"yh" = ( +/obj/machinery/door/airlock{ + name = "Restroom" + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"yy" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"yA" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"yB" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"yC" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/vr/combat_robot_factory) +"yD" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"yE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"yG" = ( +/obj/machinery/microwave, +/obj/structure/table_frame, +/obj/item/reagent_containers/food/snacks/badrecipe, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"yI" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot, +/obj/item/paper/fluff/awaymissions/scientist_raid/report2, +/obj/item/trash/energybar, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"yJ" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"yN" = ( +/obj/machinery/light, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"yQ" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"yR" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"yU" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"yX" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lethalshot, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"za" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"ze" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"zg" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"zh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"zi" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"zo" = ( +/obj/item/ammo_casing/n762{ + pixel_x = -6; + pixel_y = 7 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"zw" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 6 + }, +/obj/structure/table, +/obj/item/weldingtool/largetank, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"zx" = ( +/obj/structure/table, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"zC" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"zE" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/closet, +/obj/item/paper/fluff/awaymissions/scientist_raid/report3, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"zK" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"zR" = ( +/obj/structure/bed, +/obj/item/bedsheet/cmo{ + name = "doctors's bedsheet" + }, +/obj/item/reagent_containers/food/snacks/meat/slab, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"zT" = ( +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"zX" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/obj/effect/decal/cleanable/blood/gibs/core, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"zZ" = ( +/turf/closed/mineral, +/area/awaymission/vr/abandoned_mine) +"Aa" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ad" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/compsci_reciever, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/scientist_raid) +"Ah" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"Ak" = ( +/obj/structure/table, +/turf/open/floor/plating, +/area/awaymission/vr/hub) +"Am" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ao" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"Ap" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"Aq" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/large, +/obj/item/kitchen/knife/combat/survival, +/obj/item/kitchen/knife/combat/survival, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ar" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = -9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Au" = ( +/obj/structure/shuttle/engine/propulsion/burst/left, +/turf/open/floor/plating/airless, +/area/awaymission/vr/scientist_raid) +"Ax" = ( +/obj/structure/bed, +/obj/item/bedsheet/rd, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"Az" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/healthanalyzer, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"AC" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"AF" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"AH" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"AL" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"AN" = ( +/turf/open/floor/carpet/blue, +/area/awaymission/vr/scientist_raid) +"AO" = ( +/obj/item/organ/tail/cat, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/innards, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"AP" = ( +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"AQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"AR" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"AT" = ( +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"AV" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"AW" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"AX" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Foreman's Office" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Bb" = ( +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"Bf" = ( +/mob/living/simple_animal/hostile/robot/advanced, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Bl" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = -6; + pixel_y = 10 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"Bm" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Bn" = ( +/obj/structure/table, +/obj/machinery/recharger, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"Bo" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Br" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Bx" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Bz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"BC" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/medical, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"BD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"BE" = ( +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/scientist_raid) +"BK" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"BL" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/innards, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"BO" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"BP" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/item/toy/cards/deck{ + pixel_x = 2 + }, +/obj/item/fireaxe, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"BQ" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"BR" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"BT" = ( +/obj/structure/rack, +/obj/item/flashlight, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"BU" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/table, +/obj/item/circular_saw, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"BV" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bucket, +/obj/item/storage/bag/trash, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Cc" = ( +/obj/machinery/door/airlock/medical{ + name = "Recovery Room" + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"Ce" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Cn" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engineering"; + req_one_access_txt = "0" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Cv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"CD" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"CF" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/awaymission/vr/hub) +"CH" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 10 + }, +/obj/structure/table, +/obj/item/storage/box/flashbangs, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"CJ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/ai/server_cabinet, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"CR" = ( +/obj/structure/showcase/horrific_experiment, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"CS" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 5 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/melee/classic_baton/telescopic{ + pixel_x = 4; + pixel_y = 7 + }, +/obj/item/melee/classic_baton/telescopic{ + pixel_x = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"CU" = ( +/obj/machinery/holopad/tutorial, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Da" = ( +/obj/machinery/light, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"Dd" = ( +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"Dj" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Dk" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"Dn" = ( +/obj/structure/rack, +/obj/item/latexballon, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Do" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/bot, +/obj/item/trash/sosjerky, +/obj/item/trash/can, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Dp" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 4 + }, +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"Dr" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ds" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Dt" = ( +/mob/living/simple_animal/hostile/alien/drone, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Dw" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Dx" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"DC" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"DE" = ( +/obj/effect/spawner/structure/window/reinforced/shutter, +/turf/open/floor/plating, +/area/awaymission/vr/scientist_raid) +"DF" = ( +/mob/living/simple_animal/hostile/poison/giant_spider, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"DG" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"DI" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"DL" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"DO" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"DP" = ( +/obj/machinery/light, +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"DS" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"Ee" = ( +/turf/open/space/basic, +/area/awaymission/vr/combat_robot_factory) +"Eg" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Eh" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/pen, +/turf/open/floor/carpet/royalblue, +/area/awaymission/vr/combat_robot_factory) +"Eq" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Command Room" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Er" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Eu" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ew" = ( +/obj/machinery/papershredder, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"EL" = ( +/mob/living/simple_animal/hostile/alien/queen/large{ + health = 250; + ranged = 0 + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"EM" = ( +/obj/machinery/computer{ + dir = 4; + name = "navigation computer" + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"EP" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"EU" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"EW" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"EZ" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Fa" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Fb" = ( +/obj/structure/flora/ausbushes/leafybush, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"Fc" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/shuttle/engine/heater, +/turf/open/floor/plating/airless, +/area/awaymission/vr/scientist_raid) +"Ff" = ( +/mob/living/simple_animal/hostile/robot, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Fg" = ( +/obj/structure/bed, +/obj/item/bedsheet/ce{ + name = "foreman's bedsheet" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/gibs/up, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"Fi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Fk" = ( +/obj/item/bedsheet, +/obj/structure/bed, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Fm" = ( +/obj/structure/spider/cocoon, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Fp" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 10 + }, +/obj/structure/ore_box, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Fq" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Fr" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/syndicatesoldier, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Ft" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -8; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -1; + pixel_y = 6 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"Fv" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"FB" = ( +/obj/structure/table, +/obj/item/storage/firstaid/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"FE" = ( +/mob/living/simple_animal/hostile/robot{ + AIStatus = 3 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"FF" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 5 + }, +/obj/structure/table, +/obj/item/fireaxe, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"FI" = ( +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"FJ" = ( +/obj/structure/showcase/cyborg{ + desc = "A stand with the empty body of an early exploration cyborg bolted to it. The series were retired after the Company realized they never found any survivors..."; + name = "model AX-7 exploration droid" + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"FM" = ( +/obj/machinery/door/airlock/public{ + name = "Canteen" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"FS" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/obj/structure/table, +/obj/item/flashlight, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Ga" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Gd" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Gk" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"Gl" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "storage compartment" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"Gu" = ( +/mob/living/simple_animal/hostile/robot/advanced, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Gw" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"GF" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Doctor's Office" + }, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/vr/combat_robot_factory) +"GG" = ( +/obj/effect/decal/cleanable/blood/footprints{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/combat_robot_factory) +"GJ" = ( +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"GK" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/obj/structure/sign/poster/official/random{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"GN" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/papershredder, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"GO" = ( +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/mine_coordinates, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"GP" = ( +/obj/effect/turf_decal/bot, +/obj/structure/table, +/obj/machinery/compsci_reciever, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"GU" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 5 + }, +/obj/structure/rack, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"GY" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"Ha" = ( +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"Hh" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Exploration Drone Distpatch" + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"Hj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Hn" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Sickbay" + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"Ho" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Hr" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/delivery, +/mob/living/simple_animal/hostile/robot, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Hv" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Hw" = ( +/turf/closed/wall, +/area/awaymission/vr/abandoned_mine) +"Hy" = ( +/obj/item/clothing/suit/armor/riot/knight{ + armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 25, "acid" = 25, "wound" = 30) + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Hz" = ( +/obj/structure/closet, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"HA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"HB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"HE" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"HG" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/combat_robot_factory) +"HI" = ( +/obj/structure/chair/office/dark, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"HN" = ( +/obj/effect/landmark/vr_spawn/vr_mission/abandoned_mine, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"HO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"HS" = ( +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/wood/broken/two, +/area/awaymission/vr/combat_robot_factory) +"HT" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 10 + }, +/obj/structure/guncase/shotgun, +/obj/item/gun/ballistic/shotgun/doublebarrel/lethal, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"HU" = ( +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"HW" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Ia" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Ig" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"Ih" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 + }, +/obj/machinery/button_puzzle{ + id = "mine_button"; + pixel_x = 24; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Im" = ( +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Ip" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe/lethal/choral, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/royalblue, +/area/awaymission/vr/combat_robot_factory) +"Ir" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/obj/item/storage/backpack, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Is" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Iw" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Ix" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Iz" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/light/broken{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"IA" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 6 + }, +/obj/structure/rack, +/obj/item/storage/firstaid/regular, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"IG" = ( +/obj/machinery/door/airlock/public{ + name = "Breakroom" + }, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"IN" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"IS" = ( +/turf/open/space/basic, +/area/awaymission/vr/abandoned_mine) +"IW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Jb" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Jc" = ( +/obj/machinery/door/airlock/security, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Je" = ( +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ji" = ( +/obj/machinery/door/password{ + name = "Factory Floor Access"; + password = "Zandar"; + voice_activated = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Jj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 6 + }, +/obj/structure/table/glass, +/obj/item/storage/firstaid/toxin, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"Jl" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Jm" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/table/optable, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Jq" = ( +/obj/item/ammo_box/magazine/m45, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Jt" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ju" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"Jv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/screwdriver, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Jy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"JE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"JG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"JH" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"JI" = ( +/obj/structure/table, +/obj/item/paper/pamphlet/away/safety_pamphlet, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"JM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"JN" = ( +/obj/structure/chair/office/dark, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"JO" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"JT" = ( +/obj/item/bedsheet, +/obj/structure/bed, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"JY" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 10 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/metal/twenty, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"JZ" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Kf" = ( +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"Kh" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/ammo_casing/shotgun/buckshot, +/obj/item/ammo_casing/shotgun/buckshot, +/obj/item/gun/ballistic/shotgun/doublebarrel/lethal, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Kl" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 9 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Km" = ( +/mob/living/simple_animal/pet/dog/bullterrier{ + dir = 4; + name = "Benny" + }, +/turf/open/floor/carpet, +/area/awaymission/vr/combat_robot_factory) +"Kp" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Kr" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Kt" = ( +/obj/structure/chair/office/light, +/turf/open/floor/carpet/royalblue, +/area/awaymission/vr/combat_robot_factory) +"Kz" = ( +/obj/item/ammo_casing/n762{ + pixel_x = -7; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"KD" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/combat_robot_factory) +"KG" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"KI" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"KM" = ( +/obj/structure/curtain, +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"KQ" = ( +/obj/machinery/light/small/broken, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"KW" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"KX" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Ld" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Le" = ( +/turf/open/floor/carpet/royalblue, +/area/awaymission/vr/combat_robot_factory) +"Lq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Lr" = ( +/obj/structure/table, +/obj/item/storage/toolbox, +/turf/open/floor/plating, +/area/awaymission/vr/hub) +"Lt" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/table, +/obj/item/disk/holodisk/combat_robot/classified, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Lu" = ( +/obj/structure/closet, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"Lz" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"LF" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/scientist_raid) +"LH" = ( +/obj/effect/decal/cleanable/blood/gibs/core, +/mob/living/simple_animal/hostile/robot{ + AIStatus = 3 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"LI" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"LK" = ( +/obj/structure/table, +/obj/item/ammo_box/magazine/m45, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"LL" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/do_not_question{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"LQ" = ( +/obj/structure/showcase/horrific_experiment, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"LS" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/obj/item/stack/sheet/mineral/gold, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"LV" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"LX" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/ai/server_cabinet, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"LZ" = ( +/obj/machinery/door/airlock/security{ + name = "Cell " + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Md" = ( +/obj/machinery/door/airlock{ + name = "Worker's Quarters" + }, +/obj/effect/decal/cleanable/blood/footprints, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Me" = ( +/obj/effect/decal/cleanable/generic, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Mh" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"Mn" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/button_puzzle{ + id = "mine_button" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Mo" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen{ + pixel_y = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Mr" = ( +/turf/open/space/basic, +/area/awaymission/vr/hub) +"Mu" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/hostile/robot, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Mv" = ( +/obj/item/paper/fluff/awaymissions/button_puzzle{ + id = "mine_button"; + pixel_y = -1 + }, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"My" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"MA" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"MC" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"MF" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/carpet/blue, +/area/awaymission/vr/combat_robot_factory) +"ML" = ( +/obj/item/gun/ballistic/automatic/pistol/m1911, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"MN" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"MQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"MR" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"MS" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"MT" = ( +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"MV" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"MW" = ( +/obj/machinery/door/airlock/public{ + name = "Bathroom" + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"MY" = ( +/obj/machinery/scanner_gate{ + desc = "A gate that disables all low-level functions of machinery passing through"; + name = "deactivation gate" + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Nd" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ni" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/blood/OMinus, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"Nn" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"Ns" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"Nw" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"NC" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"NE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"NF" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"NG" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/computer/compsci_mission_selector{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"NI" = ( +/obj/effect/mob_spawn/human/corpse/cargo_tech, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"NJ" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/vr/combat_robot_factory) +"NM" = ( +/obj/structure/curtain, +/obj/machinery/shower, +/obj/item/soap/syndie, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"NN" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"NR" = ( +/mob/living/simple_animal/hostile/robot, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"NS" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"NV" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"NW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Ob" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Od" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"Og" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Oi" = ( +/mob/living/simple_animal/hostile/robot{ + health = 25; + name = "damaged combat robot" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Om" = ( +/obj/structure/table, +/obj/item/razor, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/paper/fluff/awaymissions/button_puzzle{ + id = "mine_button"; + pixel_x = -9; + pixel_y = 3 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"On" = ( +/obj/structure/curtain, +/obj/machinery/shower{ + dir = 1 + }, +/obj/item/soap/deluxe, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"Ou" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Ov" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/spaghetti/beefnoodle{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/kitchen/fork{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Ow" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"OC" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/curtain, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"OG" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"OH" = ( +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"OI" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"OK" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/awaymission/vr/abandoned_mine) +"OL" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"OO" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"OQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 11; + pixel_y = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"OV" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"OW" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"Pa" = ( +/obj/machinery/holopad/tutorial, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Pc" = ( +/obj/structure/kitchenspike, +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"Pf" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/glass, +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/ammo_casing/n762{ + pixel_x = -7; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Pl" = ( +/obj/machinery/autolathe{ + name = "main body fabrication" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Pm" = ( +/obj/structure/rack, +/obj/item/tank/internals/oxygen, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Pn" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/large, +/obj/effect/mob_spawn/human/corpse, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Po" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Janitorial Supplies" + }, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Pu" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/curtain, +/obj/item/soap/deluxe, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"Pw" = ( +/obj/structure/chair/office/dark, +/mob/living/simple_animal/hostile/robot/advanced, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Px" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Py" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 8 + }, +/obj/structure/table, +/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag{ + pixel_x = -4; + pixel_y = -5 + }, +/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag{ + pixel_x = -3; + pixel_y = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Pz" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 4 + }, +/obj/structure/table, +/obj/item/melee/classic_baton, +/obj/item/melee/classic_baton, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"PB" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"PF" = ( +/obj/structure/barricade/security, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"PI" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/shuttle/engine/heater{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/awaymission/vr/hub) +"PK" = ( +/obj/effect/gibspawner/human, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"PN" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Armory"; + req_access_txt = "200" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"PO" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"PS" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/papershredder, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/vr/combat_robot_factory) +"PV" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/machinery/button_puzzle{ + id = "mine_button"; + pixel_x = 24; + pixel_y = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"PX" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"PY" = ( +/obj/item/bedsheet, +/obj/structure/bed, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"PZ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"Qa" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Qb" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/awaymission/vr/combat_robot_factory) +"Qd" = ( +/obj/structure/flora/ausbushes/fullgrass, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"Qe" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Qi" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Qk" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 5 + }, +/obj/machinery/suit_storage_unit/open, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Qn" = ( +/obj/machinery/door/password/floppy_disk{ + id = "mine_armory"; + name = "Armory" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Qq" = ( +/obj/structure/table_frame, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"Qr" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/scientist_raid) +"Qs" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"Qt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Qw" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Qy" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"Qz" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"QC" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"QF" = ( +/obj/effect/decal/cleanable/glass, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"QK" = ( +/obj/item/ammo_box/magazine/m45, +/obj/item/ammo_box/magazine/m45, +/obj/structure/table, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"QO" = ( +/obj/machinery/door/airlock{ + name = "Worker's Quarters" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"QQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/item/ammo_casing/n762{ + pixel_x = -7; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"QU" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/delivery, +/mob/living/simple_animal/hostile/robot/range, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"QV" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"QW" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"QY" = ( +/obj/machinery/door/password/floppy_disk{ + id = "corporate_dorm"; + name = "Classified" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Rb" = ( +/obj/machinery/ai/server_cabinet, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Rc" = ( +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"Re" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 6 + }, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Ri" = ( +/obj/structure/rack, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -9; + pixel_y = 4 + }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/soap/nanotrasen, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Rj" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/mine_robot_order, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Rl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Rp" = ( +/mob/living/simple_animal/hostile/alien/sentinel, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Rr" = ( +/turf/open/space/basic, +/area/space) +"Ru" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Rx" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"RA" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"RB" = ( +/obj/effect/landmark/vr_spawn/vr_mission/combat_robot_factory, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"RH" = ( +/obj/structure/curtain, +/obj/machinery/shower, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"RJ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/bed, +/obj/item/bedsheet/prisoner, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"RK" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"RL" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"RM" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"RQ" = ( +/obj/machinery/door/airlock/science{ + name = "Computer Science" + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"RR" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"RS" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"RV" = ( +/obj/machinery/holopad/tutorial, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"RX" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"RZ" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Sa" = ( +/obj/effect/decal/cleanable/blood/splatter, +/mob/living/simple_animal/hostile/robot, +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Sc" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Sf" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 5 + }, +/obj/structure/table, +/obj/item/storage/box/handcuffs, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Sj" = ( +/mob/living/simple_animal/hostile/poison/giant_spider/tarantula, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Sl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Sn" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"Sq" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Sr" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Ss" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"St" = ( +/obj/structure/alien/weeds/node, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"SA" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"SL" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"SM" = ( +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"SS" = ( +/obj/structure/barricade/sandbags, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"ST" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"SU" = ( +/obj/machinery/door/airlock/command{ + name = "Head Researcher" + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"SV" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/item/paper/crumpled/bloody/fluff/awaymissions/robot_factory/control_man, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"SW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/effect/mob_spawn/human/corpse, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Tf" = ( +/obj/structure/closet/crate/large, +/obj/effect/turf_decal/delivery, +/mob/living/simple_animal/hostile/robot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ti" = ( +/mob/living/simple_animal/hostile/robot/advanced, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Tj" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/table, +/obj/item/circular_saw, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"Tm" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"To" = ( +/obj/structure/table, +/obj/item/camera, +/obj/item/camera_film, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Tq" = ( +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Tr" = ( +/obj/structure/table_frame, +/obj/effect/decal/cleanable/cobweb, +/obj/item/kitchen/fork, +/obj/item/kitchen/knife{ + pixel_x = 10 + }, +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"Tu" = ( +/obj/item/ammo_casing/n762{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/ammo_casing/n762{ + pixel_x = -7; + pixel_y = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Tw" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/table/optable, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"Tz" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner/lower{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"TA" = ( +/obj/effect/landmark/vr_spawn, +/obj/effect/vr_clean_master, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"TE" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"TJ" = ( +/obj/structure/table, +/obj/item/paper/fluff/awaymissions/scientist_raid/report1, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"TO" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/belt/bandolier, +/obj/item/storage/belt/bandolier, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"TQ" = ( +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"TR" = ( +/obj/structure/window/reinforced, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"TS" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"TY" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"Ud" = ( +/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"Ue" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Uk" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/hub) +"Uo" = ( +/obj/structure/flora/tree/jungle/small{ + pixel_x = -31; + pixel_y = -3 + }, +/obj/item/bodypart/head{ + pixel_y = -11 + }, +/turf/open/floor/grass, +/area/awaymission/vr/scientist_raid) +"Up" = ( +/obj/machinery/ai/server_cabinet, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Us" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"Uw" = ( +/obj/structure/bodycontainer/morgue, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"Ux" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"UA" = ( +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"UB" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"UD" = ( +/obj/structure/table, +/obj/item/toy/talking/AI, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"UE" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"UH" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/awaymission/vr/scientist_raid) +"UI" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"UK" = ( +/obj/machinery/door/airlock/security{ + name = "Worker Protection Centre" + }, +/turf/open/floor/plating, +/area/awaymission/vr/abandoned_mine) +"UL" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"UN" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"UO" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"UP" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/structure/table/reinforced, +/obj/item/restraints/handcuffs/cable/red{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/restraints/handcuffs/cable/red{ + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"UR" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"UW" = ( +/obj/structure/table, +/obj/item/razor, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/combat_robot_factory) +"UX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Va" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Ve" = ( +/mob/living/simple_animal/hostile/robot{ + AIStatus = 3 + }, +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Vf" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Vh" = ( +/obj/machinery/ai/server_cabinet, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Vj" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Vo" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Vv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/plasteel/grimy, +/area/awaymission/vr/combat_robot_factory) +"Vx" = ( +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Vy" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"VB" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"VC" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/head/soft, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"VE" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"VG" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"VJ" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"VL" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"VO" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"VP" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"VQ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"VZ" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/pen{ + pixel_x = -7; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"Wb" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Wd" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Wf" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Storage"; + req_access_txt = "0" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"Wh" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Wi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/drip{ + pixel_x = 2; + pixel_y = 12 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Wm" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Wt" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Wv" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/crate/large, +/obj/item/stack/sheet/metal/ten, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Ww" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"WA" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/shuttle/engine/heater{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/awaymission/vr/hub) +"WB" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"WC" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/obj/machinery/scanner_gate{ + desc = "A gate that installs proprietary firmware onto any machines passing through. This one seems to have been modified."; + name = "corrupted programming gate" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"WG" = ( +/turf/closed/indestructible/riveted, +/area/awaymission/vr/combat_robot_factory) +"WH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/item/gun/ballistic/automatic/pistol/m1911, +/obj/structure/rack, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"WK" = ( +/obj/structure/table/wood, +/obj/item/stack/spacecash/c500, +/obj/item/stack/spacecash/c1000{ + pixel_x = -1; + pixel_y = 10 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"WL" = ( +/obj/structure/showcase/horrific_experiment, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"WQ" = ( +/obj/structure/closet/crate, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"WS" = ( +/obj/effect/mob_spawn/human/corpse/charredskeleton, +/obj/effect/decal/cleanable/ash/large, +/obj/machinery/light/broken{ + dir = 4 + }, +/turf/open/floor/wood/broken, +/area/awaymission/vr/combat_robot_factory) +"WW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"WY" = ( +/obj/structure/table, +/obj/item/stack/sheet/mineral/gold, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Xc" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/turf/closed/wall, +/area/awaymission/vr/abandoned_mine) +"Xe" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Xf" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/vr/abandoned_mine) +"Xg" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Xl" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"Xo" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Xp" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/hub) +"Xq" = ( +/obj/machinery/door/airlock/mining{ + name = "Cargo" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Xv" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Xw" = ( +/obj/machinery/door/airlock{ + name = "Restroom" + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/abandoned_mine) +"Xx" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/item/soap/nanotrasen, +/obj/structure/curtain, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"XC" = ( +/obj/structure/janitorialcart, +/obj/item/mop, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"XD" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"XF" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner/lower, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"XG" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"XJ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/obj/machinery/door/airlock/mining{ + name = "Storage" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"XK" = ( +/obj/structure/table/optable, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"XL" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"XN" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/pen{ + pixel_x = -7; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"XO" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"XQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/conveyor{ + id = "QMLoad" + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"XT" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/obj/structure/ore_box, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"XU" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/vr/combat_robot_factory) +"XW" = ( +/obj/structure/closet/crate/trashcart, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/awaymission/vr/combat_robot_factory) +"XY" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/hand_labeler, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Ya" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"Ye" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Yg" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Yh" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/storage/belt/bandolier, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) +"Ym" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/cafeteria, +/area/awaymission/vr/combat_robot_factory) +"Yo" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/disk/holodisk/combat_robot/experiment, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"Yp" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Yr" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets/donkpocketspicy, +/turf/open/floor/mineral/titanium/white, +/area/awaymission/vr/hub) +"Yu" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/structure/table, +/obj/item/reagent_containers/blood/random, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/scientist_raid) +"Yv" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"Yz" = ( +/obj/effect/mob_spawn/human/clown/corpse, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"YB" = ( +/obj/machinery/light, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"YF" = ( +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"YG" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"YM" = ( +/obj/item/pickaxe, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"YR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"YS" = ( +/turf/closed/indestructible/vault, +/area/awaymission/vr/abandoned_mine) +"YW" = ( +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/combat_robot_factory) +"YX" = ( +/obj/machinery/door/airlock/command{ + name = "Policy Enforcement Office" + }, +/turf/open/floor/wood, +/area/awaymission/vr/scientist_raid) +"YZ" = ( +/obj/machinery/computer{ + dir = 4; + name = "plotting computer" + }, +/turf/open/floor/mineral/titanium/blue, +/area/awaymission/vr/hub) +"Za" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Zm" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"Zn" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 4 + }, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"Zv" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/scientist_raid) +"Zy" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = -11 + }, +/obj/structure/mirror{ + pixel_x = -28 + }, +/turf/open/floor/plasteel/freezer, +/area/awaymission/vr/scientist_raid) +"ZA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/firstaid/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_x = 1 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"ZC" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"ZE" = ( +/turf/closed/wall/mineral/titanium, +/area/awaymission/vr/scientist_raid) +"ZG" = ( +/obj/effect/turf_decal/bot, +/obj/item/disk/holodisk/combat_robot/introduction, +/obj/structure/closet/crate, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"ZI" = ( +/obj/item/kirbyplants/photosynthetic, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/scientist_raid) +"ZJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 5 + }, +/obj/machinery/vending/cola/random, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/abandoned_mine) +"ZN" = ( +/obj/effect/mob_spawn/human/corpse/nanotrasensoldier, +/turf/open/floor/plasteel, +/area/awaymission/vr/combat_robot_factory) +"ZU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/awaymission/vr/combat_robot_factory) +"ZV" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/awaymission/vr/abandoned_mine) +"ZX" = ( +/mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper, +/turf/open/floor/plating/asteroid, +/area/awaymission/vr/abandoned_mine) +"ZZ" = ( +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/awaymission/vr/abandoned_mine) + +(1,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +"} +(2,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +jD +jD +IS +jD +jD +jD +jD +jD +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(3,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +TQ +TQ +KX +jD +jD +jD +TQ +TQ +TQ +jD +WG +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +ZE +ZE +ZE +ZE +ZE +ZE +ZE +ZE +ZE +ZE +ZE +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(4,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +TQ +jD +WG +qj +Ir +fb +pA +KW +Jt +ZC +qj +Je +jG +Je +Je +ks +Je +Je +pZ +hU +Je +Bm +mQ +Je +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +ZE +BE +BE +BE +BE +Ad +BE +BE +BE +UH +ZE +Au +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(5,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +TQ +oU +TQ +jD +IS +IS +IS +IS +IS +IS +jD +jD +TQ +Hw +dj +Hw +dj +Hw +TQ +jD +jD +jD +TQ +jD +WG +qj +BP +Am +hU +Je +ap +iv +Md +ap +ap +hc +Je +Je +Je +hU +Je +Je +Je +Je +Bo +Je +qj +Tr +Qq +Mh +yG +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +ZE +BE +BE +BE +BE +BE +BE +BE +BE +BE +Fc +uf +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(6,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +jD +MA +TQ +dj +HN +vY +WQ +dj +TQ +jD +qi +yf +TQ +jD +WG +qj +HE +MT +Pa +Bx +Bx +vh +qj +qj +qj +qj +qj +Je +Je +Je +Je +Je +Je +hU +Je +lL +IG +yU +GJ +oJ +Vv +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +ZE +Qr +BE +BE +kl +BE +kl +BE +BE +BE +Fc +uf +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(7,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +iJ +Im +Im +Im +iJ +TQ +jD +TQ +TQ +TQ +jD +WG +qj +vn +Wb +MT +Je +hU +uI +sH +yQ +eU +Vy +qj +qj +mj +qj +qj +qj +qj +Je +Bo +wL +qj +OV +Ns +cn +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +nF +lR +ZE +BE +BE +BE +BE +BE +BE +BE +BE +BE +Fc +uf +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(8,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +zZ +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +dj +xU +Im +bA +dj +TQ +jD +cY +dE +jx +jD +WG +qj +qj +Fa +re +pV +Lz +sW +qj +xg +Kh +IA +qj +Dn +KQ +qj +Jb +RJ +qj +eF +Je +hU +qj +qj +qj +qj +qj +xK +sF +Ni +qj +Ee +Ee +Ee +Ee +nF +lR +ZE +BE +BE +BE +BE +LF +BE +BE +BE +UH +ZE +iM +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(9,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +IS +IS +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +Hw +dj +iJ +dj +Hw +TQ +jD +Sn +jx +TQ +jD +WG +Ee +qj +qj +QO +qj +qj +qj +qj +qj +qj +qj +qj +qj +To +qj +aA +jn +qj +ju +Bo +Je +qj +dD +sF +of +Cc +qP +RV +My +qj +Ee +Ee +Ee +Ee +nF +lR +ZE +ZE +ZE +ZE +iZ +ZE +iZ +ZE +ZE +ZE +ZE +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(10,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +PK +Yz +TQ +LK +jD +IS +IS +IS +IS +jD +jD +jD +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +zZ +jD +Fm +jD +WG +Ee +qj +Je +Je +ae +qj +mf +Pu +qj +gw +YW +ik +qj +qj +qj +dJ +mp +qj +Je +xm +Je +mp +mT +Rc +DS +qj +Yo +bc +jB +qj +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +jz +PO +YG +oT +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +ya +ya +ya +ya +ya +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(11,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +IS +IS +IS +jD +IS +jD +IS +jD +jD +TQ +TQ +TQ +TQ +jD +jD +jD +IS +IS +IS +jD +QK +TQ +jD +jD +jD +jD +jD +TQ +TQ +TQ +jD +jD +jD +TQ +jD +jD +jD +WG +Ee +qj +Je +Je +Je +qj +pg +Km +qj +kW +BL +de +qj +hB +gx +BR +GN +qj +hU +Je +Je +mp +tQ +Ya +vW +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +nF +lR +oT +oT +oT +oT +QQ +vV +km +oT +oT +oT +oT +oT +oT +oT +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +ai +Bn +YZ +EM +rS +iU +ai +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(12,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +ZX +TQ +TQ +jD +IS +IS +IS +jD +jD +jD +jD +jD +jD +jD +jD +jD +zZ +jD +jD +jD +jD +jD +IS +IS +jD +jD +TQ +TQ +TQ +DF +TQ +jD +jD +TQ +TQ +TQ +jD +jD +jD +TQ +TQ +cZ +jD +WG +Ee +qj +Je +Je +Je +gT +Ha +nj +qj +TO +NV +uZ +PN +Fq +fI +Me +qK +Jc +Je +zX +Bo +qj +mU +Rc +pn +bI +hu +qj +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +oT +zE +IW +UP +Ss +df +gz +oT +jz +PO +VQ +PO +YG +oT +oT +oT +oT +oT +oT +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +Ig +ar +Tm +Tm +Tm +UD +YF +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(13,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +DF +TQ +TQ +TQ +TQ +TQ +jD +jD +IS +IS +jD +jD +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +jD +jD +jD +jD +IS +IS +jD +TQ +DF +TQ +TQ +TQ +TQ +TQ +jD +TQ +TQ +TQ +jD +jD +jD +Hy +eI +jD +jD +WG +Ee +qj +qd +Je +bU +qj +ut +fN +qj +CS +tB +AH +qj +MS +Je +Je +uC +mp +Je +Bo +Je +sO +qP +Rc +Rc +Rc +gH +qj +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +oT +WW +JN +sg +Fr +xd +oa +oT +Ss +ac +xd +Pn +Qi +oT +Wm +cu +uV +za +oT +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +vT +db +db +db +db +TR +wB +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(14,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +ee +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +IS +IS +jD +jD +jD +zZ +jD +jD +Hw +Hw +Hw +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +WG +Ee +qj +Je +Je +Je +qj +qj +qj +qj +qj +qj +qj +qj +Cv +YR +LV +bt +qj +Je +Je +hU +qj +ax +Ya +Rc +Rc +DS +qj +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +oT +VE +cO +sD +Ss +xd +zC +oT +Ss +Pn +xd +fk +Qi +oT +OG +xd +xd +RS +oT +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +vT +db +db +TA +db +TR +FJ +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(15,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +TQ +TQ +jD +jD +jD +jD +jD +jD +zZ +TQ +Hw +Hw +Hw +Hw +Hw +Hw +Hw +Hw +Hw +Bb +Hw +Bb +Hw +iB +Hw +dj +hr +dj +Hw +Hw +IS +IS +IS +IS +IS +WG +Ee +qj +Je +Je +Je +qj +UW +mP +ud +cl +qj +zR +qj +qj +qj +qj +qj +qj +fv +Je +Je +mp +yE +Gw +Az +kR +Ww +qj +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +oT +oT +oT +oT +Ar +Kz +NN +oT +Ss +BC +xd +fk +Qi +oT +kA +Sq +xd +cS +oT +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +ai +vT +db +db +db +db +QF +Od +ai +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(16,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +uK +ZX +TQ +TQ +TQ +TQ +TQ +Qa +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +YM +zZ +Hw +eQ +mL +pF +mL +pw +ny +JY +Hw +uF +Hw +uF +Hw +uF +Hw +ht +SL +mL +Fp +Hw +Hw +IS +IS +IS +IS +WG +Ee +qj +Je +Je +hn +yh +TS +tL +tL +fA +qj +AO +EP +iD +bo +Le +yC +qj +Je +hU +bU +qj +qj +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +Ss +xd +MR +Iz +yB +xd +xd +xd +Qi +oT +Ov +Hv +Ix +pK +oT +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +gS +Dk +Tw +bu +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(17,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +TQ +TQ +Hw +xl +Im +Im +eH +Im +Im +sd +Hw +iN +uF +iN +iN +iN +Hw +nH +Im +Im +XT +Hw +Hw +IS +IS +IS +IS +WG +qj +qj +qj +xw +qj +qj +qj +qj +RH +On +qj +tj +OC +qj +Kt +Ip +Ym +GF +Je +Je +Ru +qj +tC +ab +KI +qj +iS +Fg +qj +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +UB +zo +Tu +xd +xd +xd +xd +xd +Qi +oT +oT +oT +FM +oT +oT +oT +oT +oT +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +mI +by +by +bY +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(18,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +Hw +OK +OK +Hw +sx +eH +wk +Im +Wv +XF +xa +Hw +Om +iN +uF +in +dp +Hw +Qk +gZ +br +Ho +DL +Hw +IS +IS +IS +IS +WG +qj +JO +Je +Je +mQ +fG +qj +qj +qj +qj +qj +qj +qj +qj +Eh +mO +XU +mp +Je +Je +Je +AX +OO +fq +RA +qj +Qb +aq +qj +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +Qw +bk +Yp +Yp +KG +EZ +wQ +xd +Qi +Xq +xd +xd +xd +Ob +xd +xd +xd +HW +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +RL +db +db +db +db +BK +by +by +Xp +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(19,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +DF +TQ +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +TQ +TQ +jD +jD +Hw +iJ +bG +Hw +xl +Im +Im +eH +eH +sd +Hw +Hw +Hw +Xc +Xw +Hw +Hw +Hw +Hw +Hw +xl +eH +fX +Hw +IS +IS +IS +IS +WG +qj +Aq +RB +Pa +RB +JO +qj +Ee +qj +WL +Wi +qT +Lt +qj +PS +NJ +nS +qj +Je +Je +Je +mp +OO +Je +Fv +qh +ej +qq +qj +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +rw +oT +oT +oT +XY +xd +ob +EZ +VB +oT +xd +xd +xd +xd +xd +xd +xd +xd +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +mI +by +by +bY +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(20,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +Sj +TQ +TQ +TQ +jD +jD +jD +jD +jD +TQ +jD +jD +jD +jD +TQ +jD +jD +Hw +Xf +iJ +OK +xl +Im +eH +Im +Im +Ho +ue +mL +SL +mL +mL +mL +mL +mL +mL +mL +QW +eH +sd +Hw +IS +IS +IS +IS +WG +qj +ZG +Je +Je +Je +JO +qj +Ee +qj +CR +pL +CU +Ia +qj +qj +qj +qj +qj +qd +Je +wL +qj +Ew +aJ +Hz +qj +nw +eR +qj +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +lR +lR +lR +lR +oT +Dj +VC +gU +tf +uB +wa +xd +xd +xd +Zv +xd +xd +xd +xd +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +PZ +Nn +gf +ji +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(21,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +Hw +bG +iJ +OK +xl +Im +Im +Im +eH +XF +XJ +lF +zK +zK +zK +oj +zK +Tz +Im +eH +Im +eH +jt +Hw +IS +IS +IS +IS +WG +qj +JO +qp +Je +Je +GP +qj +Ee +qj +bX +UE +Oi +Rl +qj +cU +HG +gQ +kq +Je +xm +hU +qj +qj +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +lR +lR +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +xd +xd +bx +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +ai +ai +ai +db +db +db +db +db +ai +ai +ai +ai +ai +ai +ai +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(22,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +jD +TQ +TQ +TQ +jD +jD +jD +iJ +iJ +jD +jD +jD +TQ +TQ +jD +jD +Hw +iJ +iJ +Hw +Wh +Im +eH +Im +Im +rd +Hw +Hw +Hw +en +Hw +Hw +Hw +nY +JI +JI +eH +XF +yy +Hw +IS +IS +IS +IS +WG +qj +qj +qj +qj +mj +qj +qj +Ee +qj +qj +ei +pL +Hj +QY +MF +cJ +aq +kq +Je +Je +Je +qj +aY +XC +Ri +BV +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +oT +oT +Tj +lG +ZI +oT +lR +lR +oT +Xo +qI +TJ +WY +oR +oT +xd +xd +xd +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +ai +db +db +ai +db +db +db +db +db +ai +BO +hM +xJ +xJ +xJ +rN +ai +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(23,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +TQ +TQ +jD +jD +iJ +iJ +iJ +jD +jD +jD +TQ +TQ +jD +jD +Hw +Hw +Hw +Hw +xl +Im +Im +eH +Im +sd +Hw +PY +LL +mL +xx +ZV +Hw +xl +vr +JI +Im +sd +Hw +Hw +IS +IS +IS +IS +WG +Ee +Ee +qj +NW +lr +BT +qj +qj +Ee +qj +qf +pL +Ia +qj +GG +KD +Kf +vt +Je +Pa +Je +Po +NW +UA +NW +UA +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +Ud +gY +SM +sU +ml +oT +lR +lR +oT +pJ +om +om +om +hy +oT +xd +xd +xd +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +RL +db +db +db +db +ai +hm +Dd +Dd +Dd +Dd +wh +AQ +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(24,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +jD +jD +iJ +iJ +iJ +iJ +jD +jD +jD +jD +TQ +jD +jD +jD +jD +jD +Hw +nH +Im +eH +Im +Im +el +Hw +Fk +eH +Im +Im +sd +Hw +xr +eH +Im +Im +sd +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +qj +UA +NW +AC +Pm +qj +Ee +qj +PX +WH +kT +qj +Ap +dC +aq +qj +Nd +Je +qp +qj +UA +UA +UA +XW +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +Ud +SM +gp +DO +Pc +oT +lR +lR +oT +pJ +om +om +om +VG +oT +xd +xd +xd +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +Gl +db +db +db +db +db +Hh +hm +Dd +Dd +Dd +Dd +Dd +fr +ya +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(25,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +TQ +TQ +YS +iJ +iJ +iJ +iJ +jD +jD +jD +TQ +TQ +jD +jD +jD +jD +jD +Hw +rb +zK +zK +FS +Zn +sQ +Hw +kI +up +zK +Tz +ia +Hw +ot +Im +Im +eH +sd +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +qj +fg +UA +UA +bQ +qj +Ee +qj +qj +qj +qj +qj +qj +mC +qj +qj +qj +Ji +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +LQ +SM +Gk +oT +oT +oT +oT +oT +oT +pJ +om +om +om +VG +RQ +xd +xd +xd +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +db +db +db +db +db +ai +hm +Dd +Dd +Dd +Dd +Dd +NG +ya +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(26,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +TQ +TQ +tW +iJ +iJ +iJ +iJ +jD +jD +jD +TQ +TQ +jD +jD +jD +Hw +Hw +Hw +Hw +Cn +jb +jb +jb +jb +jb +jb +jb +jb +nH +sd +Hw +oG +Sr +hC +zK +vF +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +qj +VP +nq +eA +Xl +qj +Ee +qj +xu +Dr +Is +qj +ui +wO +KM +qj +rQ +kJ +kJ +kJ +UX +kJ +kJ +kJ +Lq +kJ +py +qj +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +LQ +SM +Gk +oT +yD +Uw +yD +yD +oT +pJ +om +om +om +VG +oT +Zv +xd +xd +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +rs +rs +db +db +db +ai +hm +Dd +Dd +Dd +Dd +Dd +fr +ya +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(27,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +TQ +TQ +TQ +YS +iJ +iJ +iJ +jD +jD +TQ +TQ +TQ +TQ +jD +jD +jD +Hw +Kl +Ou +Ou +an +jb +ka +Br +ST +ST +Br +oM +jb +JT +mX +jb +jb +jb +jb +oi +sb +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +qj +qj +qj +qj +qj +qj +Ee +qj +rG +Hr +Ds +qj +iQ +WS +HS +qj +eW +Je +LS +hU +Je +Sa +XQ +nc +uz +hU +Fv +qj +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +JH +SM +LI +fU +dm +sU +kD +SM +oT +pJ +om +om +om +VG +oT +oT +MW +oT +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +Yr +zx +db +db +db +ai +hm +Dd +Dd +Dd +Dd +Dd +fr +ya +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(28,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +Gu +TQ +TQ +YS +YS +YS +jD +jD +TQ +TQ +TQ +jD +jD +jD +jD +jD +Hw +bD +Sc +Im +wi +jb +AF +Im +Im +Im +Im +gb +jb +jb +jb +jb +Mn +cD +jb +th +rk +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +ra +Je +Ds +qj +qj +qj +qj +qj +Qt +DG +uz +hU +Je +me +Je +Je +uz +wL +jE +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +oT +oT +oT +Wf +oT +oT +Gk +jj +jj +SM +oT +Ce +AW +ph +Up +Rb +oT +Zy +zT +zT +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +RM +RM +db +db +db +ai +Qs +pt +Uk +Uk +MQ +Dd +fr +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(29,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +Gu +TQ +jD +jD +TQ +TQ +jD +jD +jD +jD +jD +jD +Hw +Hw +FF +wm +zw +jb +AF +Im +Ti +Ti +Im +gb +jb +bn +cX +sq +vj +uT +jb +RK +gb +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +ra +Je +zg +jr +um +qj +rQ +Bz +fd +Je +Mu +Je +hU +kv +Je +Je +Ff +Jv +Fv +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +kg +qL +wJ +wJ +vq +oT +Gk +yD +yD +SM +oT +oT +RQ +oT +oT +oT +oT +MC +zT +fu +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +RL +db +db +db +Da +ai +ai +ai +ai +ai +Qs +pt +Nw +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(30,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +Gu +TQ +TQ +Gu +TQ +TQ +jD +jD +jD +jD +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +Hw +Hw +Hw +Hw +jb +AF +Pw +GO +DC +PB +gb +jb +AF +nK +mW +eH +gb +jb +tZ +rH +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +xh +yX +Je +Tf +eE +qj +dZ +Je +Je +Je +uz +vb +Yg +MN +Je +hU +uz +ws +Fv +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +wJ +wJ +wJ +wJ +OW +oT +LI +vD +SM +SM +oT +xd +xd +xd +oT +lR +oT +zT +zT +zT +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +db +db +db +db +db +ai +kp +kp +kp +ai +ai +ai +ai +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(31,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +TQ +TQ +Qa +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +jD +jb +AF +Pw +DC +DC +ua +mG +tz +Er +Ue +aV +Im +gb +tK +JZ +gb +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +ra +Je +Je +Je +Ds +hV +Ow +Je +hU +wL +Pl +XQ +sC +MN +Je +Je +MY +Je +Za +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +wJ +wJ +wJ +wJ +oT +oT +oT +mc +oT +oT +oT +xd +xd +xd +oT +lR +oT +Xx +oT +Qy +oT +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +db +db +db +db +db +vH +bP +bP +CF +ai +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(32,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +jD +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +TQ +TQ +Qa +DF +TQ +TQ +DF +jD +jD +jD +jD +jD +jD +jb +AF +Im +Ti +Ti +Im +gb +jb +AF +UI +Im +eH +gb +jb +tZ +ze +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +qj +rG +QU +hU +gi +Ds +qj +FB +RX +AR +AR +AR +Rx +HB +AR +AR +oH +do +AR +uG +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +wJ +xE +Bl +yN +oT +xd +PF +xd +xd +Ob +xd +xd +xd +bx +oT +lR +oT +oT +oT +oT +oT +oT +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +ai +ai +ai +ai +db +db +db +db +db +ai +bP +bP +bP +ai +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(33,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +TQ +jD +jD +jD +TQ +TQ +TQ +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +cZ +jD +jD +jD +jD +jb +oE +XO +Im +Im +Im +gb +jb +Ih +PV +iP +Rj +Re +jb +Og +gb +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +aM +oK +OL +OL +Vj +hE +qj +qj +qj +qj +qj +qj +qj +qj +qj +qj +vl +qj +ma +qj +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +wJ +HI +xE +wJ +YX +xd +xd +xd +PF +xd +xd +xd +xd +Do +oT +lR +oT +xY +AP +Ah +Fb +oT +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +Ft +NS +MV +db +db +ai +Lr +Ak +Ak +ai +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(34,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +jD +jD +jD +IS +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +zZ +zZ +jD +TQ +jD +jD +jD +TQ +TQ +jD +jD +jD +DF +TQ +DF +TQ +jD +jD +jD +jD +jb +jb +WB +UO +UO +Px +mq +jb +jb +jb +jb +jb +jb +jb +Og +rH +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +qj +qj +qj +qj +qj +qj +qj +Fi +Va +Va +AL +Wd +Va +Va +Va +Va +qz +Wd +Va +Xv +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +wJ +wJ +XN +wJ +oT +PF +xd +xd +xd +xd +xd +xd +xd +yI +oT +lR +oT +EU +Uo +AP +rE +oT +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +ai +ai +ai +ai +xs +ai +ai +ai +ai +ai +ai +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(35,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +jD +TQ +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +jD +jD +jD +jD +TQ +TQ +Mv +jD +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +UL +Xe +Xe +GK +HA +QC +hZ +ru +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +vk +nI +zh +jT +qj +fR +zX +Je +Je +Je +uz +Ve +TE +Ve +yA +Je +hU +Jy +qj +Ee +Ee +Ee +Ee +nF +lR +lR +oT +wJ +lU +oT +oT +oT +oT +oT +co +oT +oT +oT +oT +oT +oT +oT +lR +oT +AP +AP +er +AP +oT +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(36,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +jD +jD +TQ +jD +jD +TQ +TQ +TQ +TQ +Dt +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +DF +jD +jD +jb +lI +vZ +HT +jb +Eg +ZZ +vZ +Py +CH +Hw +Wt +Kr +AV +AV +AV +xP +AV +az +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +lk +Rc +Ya +DS +qj +Zm +hU +Je +Je +ZN +LH +sm +Je +Je +Je +Je +Je +Jy +qj +Ee +Ee +Ee +Ee +nF +lR +oT +oT +bv +oT +oT +vQ +vP +LX +Kp +XG +OI +bf +Jm +BU +oT +lR +lR +lR +oT +Qd +AP +AP +sL +oT +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(37,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +jD +TQ +TQ +jD +jD +TQ +TQ +TQ +St +TQ +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +jD +jD +jD +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +Mv +hF +Yh +qk +tX +jb +rT +qk +qk +qk +tX +Hw +VJ +mE +Hw +Hw +Hw +Hn +Hw +Hw +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +XK +UR +UR +nN +dh +VO +iy +iy +NF +Je +uz +ws +Je +hU +Je +ZN +Je +rj +qj +Ee +Ee +Ee +Ee +nF +lR +oT +aW +Ao +gc +oT +CJ +om +Vh +ff +om +Vx +FI +RR +OQ +oT +oT +oT +oT +oT +DE +xd +xd +DE +oT +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(38,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +jD +St +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +Qa +Qa +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +jD +TQ +TQ +jD +TQ +Sj +hF +rT +qk +tX +Qn +rT +qk +qk +qk +tX +Hw +jg +mE +Hw +JM +hH +Us +TY +rO +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +HU +bc +jA +ZU +qj +fR +Je +hU +fi +hU +FE +Je +Je +Je +Je +Je +Je +Jy +qj +Ee +Ee +Ee +Ee +nF +lR +oT +wJ +NE +Lu +oT +CJ +om +Vh +ff +om +Vx +gK +BQ +qs +oT +lV +UN +RZ +UN +UN +UN +Iw +UN +ls +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +db +db +db +db +db +WA +ew +ew +ew +ew +ew +PI +db +db +db +db +db +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(39,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +Dt +TQ +TQ +Dt +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +TQ +TQ +jD +jD +DF +TQ +TQ +TQ +TQ +TQ +hF +fp +qk +tX +jb +rT +qk +qk +qk +tX +UK +jg +mE +Hw +Ju +jO +GY +jO +dq +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +qj +qj +qj +qj +qj +fR +Je +zX +fi +Je +uz +Je +Je +Je +Je +Je +Je +Jy +qj +Ee +Ee +Ee +Ee +nF +oT +oT +ex +oT +oT +oT +CJ +om +Vh +ff +om +om +om +om +VG +co +wP +xd +xd +xd +xd +AT +xd +df +gC +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +ew +ew +ew +ai +ew +oq +oq +oq +oq +oq +oq +oq +ew +ai +ew +ew +ew +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(40,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +DF +jD +jb +GU +Vf +VL +jb +Sf +gM +Pz +gM +VL +Hw +jg +mE +Hw +DI +jO +NI +jO +DP +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +HO +Qe +Aa +QV +Qe +hz +Qe +Qe +Qe +Aa +Eu +Qe +iw +qj +Ee +Ee +Ee +Ee +nF +oT +NM +Dx +oT +rf +XG +XD +om +XD +om +om +om +om +om +VG +oT +Sl +bq +bq +bq +bq +bq +EW +xd +gC +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +ai +oq +oq +oq +ai +oq +Mr +Mr +Mr +Mr +Mr +Mr +Mr +oq +ai +oq +oq +oq +ai +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(41,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +jD +TQ +TQ +TQ +Dt +TQ +TQ +EL +TQ +TQ +TQ +St +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +jD +jD +TQ +TQ +jD +jD +jb +jb +jb +jb +jb +Hw +tA +Hw +LZ +Hw +Hw +jg +mE +Hw +ZJ +Dp +ZA +Dp +Jj +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +qj +qj +qj +qj +qj +wy +qj +pk +qj +qj +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +nF +oT +oT +oT +oT +iH +om +om +om +om +om +om +om +om +om +VG +oT +oT +oT +oT +oT +oT +oT +wP +xd +YB +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(42,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +jD +TQ +TQ +TQ +St +TQ +TQ +TQ +TQ +TQ +Rp +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +TQ +jD +jD +jD +jD +TQ +jD +jD +jD +jD +jD +jD +jD +Hw +pe +pe +Hw +dT +fL +Hw +jg +yJ +Hw +Hw +Hw +Hw +Hw +Hw +Hw +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +pL +pL +bH +Dw +pL +Yv +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +oT +pO +AW +AW +AW +AW +AW +AW +ph +tP +tP +Yu +oT +lR +lR +lR +lR +lR +oT +Tq +Ld +gC +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(43,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +jD +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +Dt +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +TQ +TQ +TQ +TQ +jD +Qa +jD +jD +jD +jD +jD +jD +jD +Hw +dT +pv +Hw +Jl +dT +Hw +jg +mE +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +pL +pL +pL +Dw +pL +pU +pU +Yv +bH +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +oT +oT +oT +oT +un +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +oT +tc +Ga +gC +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(44,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +jD +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +IS +IS +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +Hw +mv +dT +Hw +pe +pe +Hw +jg +mE +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +yR +pL +pL +NR +pL +Dw +pL +NR +pL +WC +Xg +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +NC +pc +ko +Ye +oT +lR +lR +lR +oT +oT +oT +oT +dB +vu +vp +wJ +oT +rh +xd +gC +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(45,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +jD +jD +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +St +TQ +TQ +TQ +TQ +St +TQ +TQ +jD +IS +IS +jD +jD +jD +TQ +TQ +jD +jD +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +Hw +Hw +Hw +Hw +Hw +Hw +Hw +Hw +jg +mE +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +bH +pL +pL +pL +oP +bH +pL +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +WW +eB +hS +dw +oT +lR +lR +lR +oT +Ax +hq +oT +dB +ag +vp +wJ +oT +wP +xd +gC +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(46,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +jD +jD +TQ +TQ +jD +TQ +TQ +TQ +Dt +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +IS +IS +jD +jD +jD +jD +TQ +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +Hw +bG +iJ +iJ +OK +mo +mo +aE +hO +mE +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +pL +pL +NR +bH +NR +pL +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +vy +Pf +Gd +dw +oT +lR +lR +lR +oT +OH +xp +bv +AN +AN +AN +wJ +SU +wP +xd +gC +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(47,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +jD +Mv +TQ +TQ +Qa +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +IS +IS +IS +jD +jD +jD +TQ +jD +jD +jD +jD +TQ +TQ +TQ +TQ +jD +jD +jD +Hw +Xf +iJ +iJ +OK +Qz +Qz +Qz +Qz +SA +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +SS +SS +SS +pL +SS +SS +SS +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +zi +pc +xd +dw +oT +lR +lR +lR +oT +tO +wJ +oT +wJ +wJ +wJ +wJ +oT +Sl +CD +Ux +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(48,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +jD +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +TQ +TQ +jD +jD +jD +IS +IS +IS +jD +jD +jD +TQ +jD +jD +jD +jD +jD +jD +TQ +TQ +TQ +jD +jD +Hw +iJ +bG +Hw +Hw +Hw +Hw +Hw +Hw +Hw +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +SS +rZ +bH +pL +pL +rZ +SS +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +WW +gn +xd +nD +oT +lR +lR +lR +oT +oT +oT +oT +VZ +WK +bS +wJ +oT +oT +oT +oT +oT +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(49,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +jD +jD +TQ +jD +jD +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +jD +jD +TQ +jD +jD +jD +IS +IS +IS +IS +jD +jD +TQ +jD +jD +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +Hw +iJ +iJ +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +yR +pL +pL +pL +pL +pL +pL +bH +pL +pL +Xg +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +SW +rJ +cO +ao +oT +lR +lR +lR +lR +lR +lR +oT +oT +oT +oT +oT +oT +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(50,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +jD +jD +jD +IS +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +jD +jD +jD +jD +jD +TQ +zZ +TQ +TQ +jD +jD +Hw +OK +OK +Hw +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +bH +pL +pL +Bf +pL +Bf +pL +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +oT +oT +oT +oT +oT +oT +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(51,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +jD +jD +jD +fE +TQ +Jq +zZ +YM +TQ +jD +jD +jD +TQ +TQ +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +pL +bH +pL +pL +pL +pL +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +lR +lR +lR +lR +lR +oT +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(52,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +jD +jD +fc +cZ +am +TQ +jD +TQ +TQ +TQ +TQ +jD +YM +TQ +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +pL +dS +pL +Bf +pL +dS +pL +bH +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(53,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +Qa +Qa +jD +jD +jD +IS +IS +IS +IS +IS +IS +jD +jD +TQ +jD +jD +Jq +TQ +am +jD +jD +jD +TQ +TQ +TQ +TQ +zZ +zZ +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +Bf +qj +pL +pL +pL +qj +Bf +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(54,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +TQ +TQ +TQ +jD +jD +jD +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +jD +jD +am +cZ +jD +jD +jD +jD +jD +jD +TQ +TQ +TQ +TQ +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +bH +Vo +pL +pL +pL +Vo +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +lR +my +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +Mr +my +"} +(55,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +TQ +TQ +jD +Sn +am +TQ +jD +jD +jD +jD +jD +jD +jD +jD +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +yR +pL +pL +pL +ij +pL +ij +pL +pL +pL +Xg +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +nF +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +my +"} +(56,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +TQ +TQ +jD +jD +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +TQ +TQ +TQ +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +bH +pL +pL +pL +dn +pL +bH +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(57,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +TQ +TQ +TQ +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +pL +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(58,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +qj +qj +qj +qj +qj +Eq +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(59,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +TQ +jD +jD +TQ +TQ +TQ +TQ +TQ +TQ +jD +jD +jD +TQ +TQ +TQ +jD +jD +TQ +TQ +TQ +TQ +jD +jD +jD +TQ +TQ +TQ +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +rg +XL +XL +XL +JG +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(60,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +TQ +TQ +TQ +TQ +jD +TQ +TQ +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +TQ +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +eJ +pL +ML +pL +jy +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(61,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +jD +TQ +jD +jD +jD +jD +jD +jD +jD +jD +IS +IS +jD +jD +IS +jD +jD +jD +jD +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +ei +oP +SV +bH +Ia +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(62,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +jD +jD +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +JE +Mo +ef +BD +IN +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(63,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +qj +qj +qj +qj +qj +qj +qj +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(64,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +jD +jD +jD +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +IS +WG +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +Ee +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(65,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +jb +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +WG +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(66,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(67,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(68,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(69,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(70,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(71,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(72,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(73,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(74,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(75,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(76,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(77,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(78,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(79,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(80,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(81,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(82,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(83,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(84,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(85,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(86,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(87,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(88,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(89,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(90,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(91,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(92,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(93,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(94,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(95,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(96,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(97,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(98,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(99,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(100,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(101,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(102,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(103,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(104,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(105,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(106,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(107,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(108,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(109,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(110,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(111,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(112,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(113,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(114,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(115,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(116,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(117,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(118,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(119,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(120,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(121,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(122,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(123,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(124,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(125,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(126,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(127,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(128,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(129,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(130,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(131,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(132,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(133,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(134,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(135,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(136,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(137,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(138,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(139,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(140,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(141,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(142,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(143,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(144,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(145,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(146,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(147,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(148,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(149,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(150,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(151,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(152,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(153,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(154,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(155,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(156,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(157,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(158,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(159,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(160,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(161,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(162,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(163,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(164,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(165,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(166,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(167,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(168,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(169,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(170,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(171,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(172,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(173,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(174,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(175,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(176,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(177,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(178,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(179,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(180,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(181,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(182,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(183,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(184,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(185,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(186,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(187,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(188,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(189,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(190,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(191,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(192,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(193,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(194,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(195,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(196,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(197,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(198,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(199,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(200,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(201,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(202,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(203,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(204,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(205,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(206,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(207,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(208,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(209,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(210,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(211,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(212,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(213,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(214,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(215,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(216,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(217,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(218,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(219,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(220,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(221,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(222,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(223,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(224,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(225,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(226,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(227,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(228,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(229,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(230,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(231,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(232,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(233,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(234,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(235,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(236,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(237,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(238,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(239,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(240,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(241,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(242,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(243,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(244,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(245,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(246,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(247,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(248,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(249,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(250,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(251,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(252,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(253,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(254,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} +(255,1,1) = {" +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +Rr +"} diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index f872be190442..8a7547f10ea6 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -10313,7 +10313,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) "xN" = ( @@ -10531,7 +10531,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) "yp" = ( @@ -11732,7 +11732,7 @@ /area/awaymission/snowdin/cave) "Bw" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small{ dir = 4 }, @@ -11907,7 +11907,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small{ brightness = 3; dir = 8 @@ -13337,7 +13337,7 @@ /area/awaymission/snowdin/outside) "Fn" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) "Fo" = ( @@ -13351,7 +13351,7 @@ /area/awaymission/snowdin/outside) "Fq" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small{ dir = 1 }, diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index 9b32a92f57e8..7b17864b8c0a 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -4719,8 +4719,7 @@ icon = 'icons/obj/smooth_structures/wood_table.dmi'; icon_state = "wood_table"; max_integrity = 55; - name = "flipped table"; - obj_integrity = 55 + name = "flipped table" }, /turf/open/floor/plasteel{ dir = 1 @@ -4898,8 +4897,7 @@ icon = 'icons/obj/smooth_structures/wood_table.dmi'; icon_state = "wood_table"; max_integrity = 55; - name = "flipped table"; - obj_integrity = 55 + name = "flipped table" }, /turf/open/floor/plasteel, /area/awaymission/research/interior/dorm) diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 06790c21b9f7..72be40fc2578 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -10439,7 +10439,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) "xN" = ( @@ -10660,7 +10660,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) "yp" = ( @@ -11875,7 +11875,7 @@ /area/awaymission/snowdin/cave) "Bw" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small{ dir = 4 }, @@ -12048,7 +12048,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small{ brightness = 3; dir = 8 @@ -13476,7 +13476,7 @@ /area/awaymission/snowdin/outside) "Fn" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) "Fo" = ( @@ -13490,7 +13490,7 @@ /area/awaymission/snowdin/outside) "Fq" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small{ dir = 1 }, diff --git a/_maps/map_files/AsteroidStation/AsteroidStation.dmm b/_maps/map_files/AsteroidStation/AsteroidStation.dmm index faf61fb15bba..e0acd6fd0e4a 100644 --- a/_maps/map_files/AsteroidStation/AsteroidStation.dmm +++ b/_maps/map_files/AsteroidStation/AsteroidStation.dmm @@ -183,7 +183,9 @@ /turf/open/floor/carpet, /area/crew_quarters/cryopods) "abM" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "abP" = ( @@ -703,6 +705,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "agl" = ( @@ -890,13 +896,13 @@ /turf/open/floor/plating, /area/maintenance/disposal) "ahZ" = ( -/obj/structure/closet/secure_closet/freezer/fridge, /obj/effect/decal/cleanable/dirt, /obj/machinery/camera{ c_tag = "Prison Cafeteria"; dir = 4; network = list("ss13","prison") }, +/obj/structure/closet/secure_closet/freezer/fridge/open, /turf/open/floor/plasteel/white, /area/security/prison) "aib" = ( @@ -990,9 +996,9 @@ dir = 2; dwidth = 3; height = 5; - shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; + shuttle_id = "mining_home"; width = 7 }, /turf/open/space/basic, @@ -1107,12 +1113,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) -"akg" = ( -/obj/machinery/computer/ai_resource_distribution{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) "akh" = ( /turf/closed/wall/r_wall, /area/science/storage) @@ -1130,15 +1130,15 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "akI" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ - dir = 4 - }, /obj/item/radio/intercom{ dir = 8; name = "Station Intercom (Court)"; pixel_x = 32; pixel_y = 27 }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "akJ" = ( @@ -1258,6 +1258,12 @@ "alD" = ( /turf/open/floor/carpet, /area/library) +"alE" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "alH" = ( /obj/effect/turf_decal/trimline/white/filled/line/lower{ dir = 9 @@ -1317,8 +1323,8 @@ "alS" = ( /obj/docking_port/stationary/random{ dir = 2; - shuttle_id = "pod_lavaland4"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland4" }, /turf/open/space/basic, /area/space) @@ -1478,9 +1484,6 @@ /obj/item/reagent_containers/food/drinks/drinkingglass, /turf/open/floor/wood, /area/hallway/secondary/entry) -"amR" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/secondarydatacore) "ana" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, @@ -1666,12 +1669,6 @@ }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) -"aoX" = ( -/obj/machinery/computer/ai_control_console{ - dir = 1 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "aoZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -1990,12 +1987,12 @@ dir = 1 }, /obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "arK" = ( @@ -2120,15 +2117,6 @@ }, /turf/open/space/basic, /area/solar/port/fore) -"asM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "asO" = ( /turf/open/floor/plasteel, /area/engine/engineering) @@ -2242,6 +2230,23 @@ /obj/structure/girder, /turf/open/floor/plating, /area/maintenance/port/aft) +"atL" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + dir = 4; + name = "Waste to Space" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "atP" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -2411,12 +2416,12 @@ persistence_id = "public"; pixel_x = -32 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/green/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "avI" = ( @@ -2540,7 +2545,7 @@ /turf/open/floor/carpet/green, /area/hallway/secondary/entry) "awN" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine, /area/science/storage) "awR" = ( @@ -2870,8 +2875,8 @@ dir = 8; dwidth = 11; height = 22; - shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; + shuttle_id = "whiteship_home"; width = 35 }, /turf/open/space/basic, @@ -2902,13 +2907,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aAn" = ( -/obj/structure/frame/machine{ - anchored = 1; - state = 2 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "aAq" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance/two, @@ -3170,9 +3168,9 @@ dir = 2; dwidth = 3; height = 15; - shuttle_id = "arrivals_stationary"; name = "arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/box; + shuttle_id = "arrivals_stationary"; width = 7 }, /turf/open/space/basic, @@ -3231,7 +3229,7 @@ "aCu" = ( /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "10;13" + req_access_txt = "10" }, /obj/structure/cable{ icon_state = "1-2" @@ -3434,8 +3432,8 @@ dir = 2; dwidth = 5; height = 7; - shuttle_id = "supply_home"; name = "Cargo Bay"; + shuttle_id = "supply_home"; width = 12 }, /turf/open/space/basic, @@ -3463,8 +3461,8 @@ dir = 4; dwidth = 12; height = 18; - shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; + shuttle_id = "emergency_home"; width = 32 }, /turf/open/space/basic, @@ -3665,13 +3663,13 @@ /obj/structure/chair/office/dark{ dir = 4 }, -/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ - dir = 4 - }, /obj/machinery/recharger/wallrecharger{ pixel_x = 36; pixel_y = 20 }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "aFT" = ( @@ -4136,10 +4134,10 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -4167,7 +4165,7 @@ /area/ai_monitored/security/armory) "aJH" = ( /obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "aJI" = ( @@ -4262,8 +4260,8 @@ /area/crew_quarters/dorms) "aKW" = ( /obj/docking_port/stationary/random{ - shuttle_id = "pod_lavaland1"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland1" }, /turf/open/space/basic, /area/space) @@ -4695,8 +4693,8 @@ dir = 2; dwidth = 2; height = 13; - shuttle_id = "ferry_home"; name = "port bay 2"; + shuttle_id = "ferry_home"; width = 5 }, /turf/open/space/basic, @@ -4894,8 +4892,8 @@ /area/space/nearstation) "aSm" = ( /obj/docking_port/stationary/random{ - shuttle_id = "pod_lavaland2"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland2" }, /turf/open/space/basic, /area/space) @@ -5032,18 +5030,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/maintenance/port/aft) -"aTm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/requests_console{ - department = "AI"; - departmentType = 5; - pixel_x = 0; - pixel_y = -32 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "aTp" = ( /turf/closed/wall, /area/security/checkpoint/supply) @@ -5159,10 +5145,10 @@ pixel_x = 24 }, /obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/trimline/brown/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/effect/turf_decal/trimline/brown/filled/corner/lower, /turf/open/floor/plasteel, /area/quartermaster/miningdock) "aUw" = ( @@ -5364,13 +5350,13 @@ /turf/open/floor/engine, /area/science/explab) "aXn" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "aXo" = ( @@ -5508,10 +5494,10 @@ /turf/open/space, /area/space) "aYx" = ( -/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "aYz" = ( @@ -5595,9 +5581,9 @@ dir = 8; dwidth = 2; height = 5; - shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; + shuttle_id = "laborcamp_home"; width = 9 }, /turf/open/space/basic, @@ -5719,10 +5705,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"aZV" = ( -/obj/machinery/ai/data_core, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "aZW" = ( /turf/open/floor/plasteel, /area/hallway/primary/fore) @@ -5832,7 +5814,7 @@ /area/maintenance/port/fore) "baZ" = ( /obj/machinery/modular_computer/console/preset/engineering, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel/dark, @@ -5911,6 +5893,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, /area/security/prison) +"bds" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/port/fore) "bdu" = ( /obj/structure/chair/sofa/corner, /obj/effect/turf_decal/siding/wood{ @@ -6062,6 +6048,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "bfn" = ( @@ -6179,6 +6168,9 @@ pixel_x = 15; pixel_y = -4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "bhm" = ( @@ -6513,6 +6505,15 @@ /obj/item/assembly/timer, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"bmF" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/central) "bmS" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 5 @@ -7161,23 +7162,14 @@ /obj/structure/extinguisher_cabinet{ pixel_y = 30 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, -/turf/open/floor/plasteel, -/area/storage/tech) -"bzt" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 1 }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) +/turf/open/floor/plasteel, +/area/storage/tech) "bzD" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/engine, @@ -7249,26 +7241,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"bBq" = ( -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_exterior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -7; - pixel_y = -24; - req_one_access_txt = "30;70" - }, -/obj/machinery/doorButtons/airlock_controller{ - idExterior = "secondary_aicore_exterior"; - idInterior = "secondary_aicore_interior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Console"; - pixel_x = 6; - pixel_y = -26; - req_one_access_txt = "30;70" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/secondarydatacore) "bBt" = ( /turf/open/water/safe, /area/space/nearstation) @@ -7430,6 +7402,21 @@ /obj/machinery/vending/gifts, /turf/open/floor/plasteel, /area/clerk) +"bEq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bEw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -7446,6 +7433,15 @@ /obj/structure/janitorialcart, /turf/open/floor/plating, /area/maintenance/port/fore) +"bET" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "bFc" = ( /obj/structure/sign/poster/random, /turf/closed/wall/r_wall, @@ -7912,6 +7908,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "bOA" = ( @@ -8524,7 +8523,7 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bZf" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plasteel/dark, /area/engine/engineering) "bZn" = ( @@ -8855,7 +8854,7 @@ /turf/open/floor/engine, /area/science/storage) "cdi" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/atmospherics/miner/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos/distro) @@ -8875,6 +8874,16 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) +"cdr" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "cdt" = ( /obj/effect/turf_decal/pool{ dir = 4 @@ -8886,7 +8895,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -9407,7 +9416,7 @@ /obj/item/radio/intercom{ pixel_y = -30 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "cjs" = ( @@ -9578,6 +9587,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port) "clL" = ( @@ -9766,12 +9778,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "cpB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqa" = ( @@ -9783,6 +9795,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "cqc" = ( @@ -9859,10 +9874,22 @@ /obj/machinery/vending/gifts, /turf/open/floor/plating, /area/maintenance/port/fore) +"crX" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "cse" = ( /obj/structure/disposalpipe/segment{ dir = 2 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "csp" = ( @@ -9897,12 +9924,12 @@ /area/science/xenobiology) "csz" = ( /mob/living/simple_animal/cockroach, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/green/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hydroponics) "csH" = ( @@ -10202,7 +10229,7 @@ /obj/machinery/atmospherics/components/unary/cryo_cell{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/dark, /area/medical/sleeper) "cwB" = ( @@ -10557,6 +10584,15 @@ /obj/effect/turf_decal/trimline/green/filled/corner/lower, /turf/open/floor/plasteel, /area/hydroponics) +"cCO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "cDj" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 @@ -10672,14 +10708,6 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) -"cEO" = ( -/obj/structure/closet/secure_closet/RD, -/obj/item/circuitboard/computer/ai_upload_download, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/heads/hor) "cEX" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -10704,7 +10732,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "cFm" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -11050,7 +11078,7 @@ /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "cKQ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -11083,6 +11111,9 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "cLY" = ( @@ -11132,10 +11163,6 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/captain) -"cMI" = ( -/obj/item/stack/cable_coil, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "cNa" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/white, @@ -11516,6 +11543,12 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel/freezer, /area/maintenance/starboard/aft) +"cTe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/central/secondary) "cTi" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 8; @@ -11677,23 +11710,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cWk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "AI Chamber - Fore"; - dir = 4; - network = list("aicore") - }, -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = -32; - pixel_y = 0 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "cWr" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 8 @@ -11820,12 +11836,12 @@ persistence_id = "public"; pixel_y = 32 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "cYb" = ( @@ -11865,6 +11881,9 @@ /obj/structure/cable{ icon_state = "2-8" }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "cYr" = ( @@ -11934,7 +11953,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, @@ -12220,6 +12239,9 @@ pixel_x = -4; pixel_y = -2 }, +/obj/effect/turf_decal/trimline/brown/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "ddG" = ( @@ -12340,6 +12362,10 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "dgg" = ( @@ -12741,6 +12767,21 @@ }, /turf/open/floor/plasteel/bluespace, /area/crew_quarters/heads/hor) +"dmF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "dmJ" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/secred/filled/line/lower{ @@ -12878,6 +12919,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/maintenance/port/fore) "dqe" = ( @@ -13084,17 +13126,6 @@ /obj/machinery/light/floor, /turf/open/floor/plasteel, /area/engine/atmos/distro) -"dte" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "dtk" = ( /turf/open/floor/plating, /area/maintenance/starboard) @@ -13147,7 +13178,7 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "duM" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, @@ -13331,10 +13362,10 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "dyX" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/central) "dza" = ( @@ -13561,7 +13592,7 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, @@ -13611,12 +13642,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"dEj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "dEx" = ( /obj/structure/cable{ icon_state = "1-4" @@ -13664,6 +13689,27 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"dFc" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ + dirx = 2; + diry = 1 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/command/glass{ + id_tag = "secondary_aicore_interior"; + name = "Physical Core Access"; + req_one_access_txt = "30, 70" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacoreserver) "dFy" = ( /obj/structure/cable{ icon_state = "1-2" @@ -13685,6 +13731,15 @@ }, /turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) +"dFP" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "dGv" = ( /obj/structure/window/reinforced{ dir = 1 @@ -14018,15 +14073,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/port) -"dLt" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "dLy" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 @@ -14209,6 +14255,18 @@ }, /turf/open/floor/wood, /area/medical/psych) +"dOc" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "ai_core_airlock_interior"; + idSelf = "ai_core_airlock_control"; + pixel_x = -23; + pixel_y = 7 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "dOd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -14391,9 +14449,6 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 }, @@ -14713,15 +14768,6 @@ }, /turf/open/floor/carpet/red, /area/bridge) -"dTL" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "dTM" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 4 @@ -14792,7 +14838,7 @@ /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "dUR" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -15370,7 +15416,7 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "edP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -15388,6 +15434,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/starboard/fore) "eeD" = ( @@ -15433,6 +15480,12 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) +"efc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central/secondary) "eff" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -15477,7 +15530,7 @@ dir = 4; pixel_y = -22 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -15695,8 +15748,7 @@ dir = 1 }, /obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; - req_one_access_txt = "10;61" + name = "Escape Pod Four" }, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -16034,6 +16086,9 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "enG" = ( @@ -16044,11 +16099,20 @@ /turf/open/floor/plasteel, /area/security/prison) "enU" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "eod" = ( /obj/structure/cable{ icon_state = "1-8" @@ -16159,6 +16223,19 @@ /obj/item/toy/beach_ball/holoball, /turf/open/floor/plasteel, /area/security/prison) +"epK" = ( +/obj/machinery/power/apc{ + areastring = "/area/science/server"; + dir = 4; + name = "Server Room APC"; + pixel_x = 24 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/turf/open/floor/engine, +/area/science/explab) "epY" = ( /obj/structure/cloth_curtain{ color = "#99ccff" @@ -16327,13 +16404,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"erD" = ( -/obj/structure/frame/machine{ - anchored = 1; - state = 2 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "erI" = ( /obj/structure/chair/stool/bar, /obj/effect/decal/cleanable/dirt, @@ -17060,6 +17130,25 @@ }, /turf/open/floor/plasteel/white, /area/science/explab) +"eEq" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ + dirx = -2; + diry = -1 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/command/glass{ + id_tag = "secondary_aicore_exterior"; + name = "Physical Core Access"; + req_one_access_txt = "30;70" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "eEw" = ( /obj/structure/cable{ icon_state = "4-8" @@ -17094,7 +17183,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -17121,6 +17210,21 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"eFc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "eFi" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 1 @@ -17204,6 +17308,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/central/secondary) "eGp" = ( @@ -17699,7 +17804,9 @@ icon_state = "1-2"; tag = "" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plasteel/dark, /area/medical/sleeper) "eNk" = ( @@ -17938,13 +18045,12 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"eQt" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 +"eQu" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "eQv" = ( /turf/open/floor/wood, /area/security/courtroom) @@ -18002,10 +18108,10 @@ /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/fore) "eRA" = ( @@ -18218,7 +18324,7 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -18252,7 +18358,7 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "eUE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -18336,7 +18442,7 @@ /turf/open/floor/carpet/royalblack, /area/maintenance/port) "eXj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line/lower, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel, /area/storage/tech) "eXk" = ( @@ -18588,6 +18694,24 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"fam" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "faF" = ( /obj/machinery/modular_computer/console/preset/medical{ dir = 4 @@ -19074,6 +19198,9 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/plasteel, /area/engine/engineering) +"fhe" = ( +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "fhh" = ( /obj/effect/landmark/start/botanist, /obj/effect/turf_decal/trimline/green/filled/line/lower{ @@ -19141,7 +19268,7 @@ dir = 1; pixel_y = -26 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/janitor) "fid" = ( @@ -19431,7 +19558,7 @@ /area/science/server) "fnp" = ( /obj/machinery/computer/aifixer, -/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel/dark, @@ -19485,7 +19612,7 @@ /turf/open/floor/plasteel/white, /area/science/nanite) "fom" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light{ dir = 1 }, @@ -19638,6 +19765,26 @@ /obj/item/shovel/spade, /turf/open/floor/plasteel, /area/security/prison) +"fsb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/rack, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "fsf" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 @@ -19740,6 +19887,14 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"fuA" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "fuC" = ( /obj/structure/cable{ icon_state = "4-8" @@ -19903,6 +20058,9 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port) "fxC" = ( @@ -20019,12 +20177,12 @@ /area/engine/foyer) "fyZ" = ( /obj/machinery/vending/cigarette, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "fzj" = ( @@ -20132,6 +20290,9 @@ department = "Bridge"; name = "Bridge Fax Machine" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "fBs" = ( @@ -20457,6 +20618,7 @@ /obj/structure/cable{ icon_state = "0-4" }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/maintenance/port/fore) "fHr" = ( @@ -20507,6 +20669,13 @@ }, /turf/open/floor/plating, /area/maintenance/central/secondary) +"fIR" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "fIS" = ( /obj/effect/decal/cleanable/food/pie_smudge, /turf/open/floor/plasteel/freezer, @@ -20651,7 +20820,7 @@ }, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "10;13" + req_access_txt = "10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -20753,6 +20922,13 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) +"fNL" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "fNM" = ( /obj/machinery/camera{ c_tag = "Central Primary Hallway South" @@ -20811,7 +20987,7 @@ /obj/machinery/airalarm{ pixel_y = 24 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -21375,6 +21551,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"fWH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "fWL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -21544,6 +21733,24 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) +"gau" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "gav" = ( /obj/structure/sign/poster/official/enlist, /turf/closed/wall, @@ -21662,6 +21869,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"gda" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/secondarydatacoreserver) "gdp" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/plasteel, @@ -21726,6 +21939,13 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"gdS" = ( +/obj/structure/frame/machine{ + anchored = 1; + state = 2 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "gdX" = ( /obj/machinery/computer/station_alert, /turf/open/floor/plasteel/dark, @@ -21774,7 +21994,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/warning/lower{ +/obj/effect/turf_decal/trimline/dark_blue/warning/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -21795,6 +22015,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "ggH" = ( @@ -21872,6 +22095,24 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics) +"ghf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "ghi" = ( /obj/machinery/requests_console{ department = "Security"; @@ -22063,6 +22304,12 @@ /obj/effect/landmark/start/yogs/clerk, /turf/open/floor/plasteel, /area/clerk) +"gks" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) "gkv" = ( /obj/machinery/light{ dir = 1 @@ -22084,6 +22331,12 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/pumproom) +"gkx" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) "gkH" = ( /obj/structure/chair, /obj/machinery/light{ @@ -22176,6 +22429,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"gmi" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "gmx" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 10 @@ -22317,7 +22577,7 @@ /area/hallway/primary/starboard) "gol" = ( /obj/machinery/computer/crew, -/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 9 }, /turf/open/floor/plasteel/dark, @@ -22410,27 +22670,6 @@ }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) -"grc" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ - dirx = 2; - diry = 1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/command/glass{ - id_tag = "secondary_aicore_interior"; - name = "Physical Core Access"; - req_one_access_txt = "30, 70" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "gry" = ( /obj/machinery/mineral/ore_redemption{ input_dir = 2; @@ -22845,10 +23084,10 @@ /area/hallway/primary/central) "gyo" = ( /obj/machinery/dna_scannernew, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "gyp" = ( @@ -22894,10 +23133,10 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "gzd" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/quartermaster/sorting) "gzr" = ( @@ -23197,6 +23436,15 @@ /obj/effect/turf_decal/trimline/secred/filled/line/lower, /turf/open/floor/plasteel, /area/security/checkpoint/science) +"gEa" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "gEd" = ( /obj/structure/cable{ icon_state = "1-2" @@ -23282,6 +23530,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/maintenance/port/fore) "gEX" = ( @@ -23450,6 +23699,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"gHW" = ( +/obj/machinery/atmospherics/pipe/manifold/general/hidden{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/secondarydatacoreserver) "gIh" = ( /obj/machinery/camera{ c_tag = "Vacant Office"; @@ -23676,16 +23931,6 @@ /obj/structure/sign/poster/official/build, /turf/closed/wall/r_wall, /area/crew_quarters/heads/chief) -"gLy" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "gLA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -23731,6 +23976,22 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"gMb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gMd" = ( /obj/structure/sign/warning/fire, /turf/closed/wall, @@ -23860,6 +24121,9 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "gND" = ( @@ -24033,7 +24297,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "gPO" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -24090,7 +24354,7 @@ /obj/machinery/airalarm{ pixel_y = 24 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -24294,6 +24558,12 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"gTg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "gTs" = ( /obj/structure/cable{ icon_state = "1-4" @@ -24577,6 +24847,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"gYG" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gYM" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -24695,12 +24971,6 @@ /obj/effect/turf_decal/sand, /turf/open/floor/plating/beach/sand, /area/crew_quarters/bar) -"hay" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "haC" = ( /obj/structure/table/wood, /obj/item/lipstick/random{ @@ -24753,7 +25023,7 @@ /area/crew_quarters/fitness) "hbx" = ( /obj/effect/turf_decal/trimline/purple/filled/corner/lower, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -24897,6 +25167,14 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"hem" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) "heD" = ( /obj/machinery/oven, /turf/open/floor/plasteel{ @@ -25098,29 +25376,6 @@ /mob/living/carbon/monkey/punpun, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"hik" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_exterior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -8; - pixel_y = -24; - req_one_access_txt = "30;70" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "hio" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced{ @@ -25251,9 +25506,6 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, /turf/open/floor/plasteel/white, /area/medical/storage/backroom) "hjR" = ( @@ -25284,6 +25536,7 @@ dir = 1; sortType = 18 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/fore) "hkh" = ( @@ -25607,6 +25860,9 @@ /obj/structure/cable{ icon_state = "2-4" }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "hpC" = ( @@ -26294,6 +26550,12 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos/distro) +"hAt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard) "hAv" = ( /obj/machinery/modular_computer/console/preset/tcomms, /turf/open/floor/plasteel/dark, @@ -26370,8 +26632,7 @@ /obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock{ name = "Service Hall"; - req_access_txt = "35"; - req_one_access_txt = "0" + req_access_txt = "35;79" }, /turf/open/floor/wood, /area/hallway/secondary/service) @@ -26652,6 +26913,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/maintenance/central) "hFQ" = ( @@ -26895,18 +27157,6 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/captain) -"hJg" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "hJG" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -26981,6 +27231,18 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"hKW" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2"; + tag = "" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "hLj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -27210,7 +27472,9 @@ /turf/open/floor/plasteel/dark, /area/science/mixing) "hOq" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "hOL" = ( @@ -27329,7 +27593,7 @@ /obj/structure/disposalpipe/trunk{ dir = 2 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -27367,25 +27631,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"hQM" = ( -/obj/machinery/power/apc{ - areastring = "/area/science/server"; - dir = 4; - name = "Server Room APC"; - pixel_x = 24 - }, -/obj/machinery/power/apc/highcap{ - areastring = "/area/ai_monitored/secondarydatacore"; - dir = 4; - name = "AI Secondary Datacore"; - pixel_x = 24 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/turf/open/floor/engine, -/area/science/explab) "hQU" = ( /obj/effect/turf_decal/trimline/brown/filled/line/lower{ dir = 8 @@ -28291,7 +28536,6 @@ /turf/open/floor/plasteel, /area/hydroponics) "iid" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 }, @@ -28302,6 +28546,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "iil" = ( @@ -28333,9 +28578,6 @@ /area/crew_quarters/dorms) "iiY" = ( /obj/machinery/light/floor, -/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ - dir = 1 - }, /obj/machinery/newscaster{ pixel_x = 32 }, @@ -28345,6 +28587,9 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "ija" = ( @@ -28450,7 +28695,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, @@ -28810,6 +29055,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) +"iqE" = ( +/obj/machinery/atmospherics/pipe/simple/general/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/secondarydatacoreserver) "iqF" = ( /obj/item/stack/ore/iron, /obj/effect/turf_decal/trimline/brown/filled/line/lower{ @@ -28850,7 +29101,7 @@ "irl" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_one_access_txt = "10;32" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -28870,6 +29121,16 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) +"irx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "irz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -29293,6 +29554,12 @@ /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, /area/maintenance/port/fore) +"ixW" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "iya" = ( /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/grass, @@ -29311,10 +29578,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "iyH" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "iyI" = ( @@ -29420,12 +29687,12 @@ /area/security/processing) "iAq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "iAE" = ( @@ -29486,8 +29753,8 @@ /area/ai_monitored/security/armory) "iBd" = ( /obj/docking_port/stationary/random{ - shuttle_id = "pod_lavaland3"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland3" }, /turf/open/space/basic, /area/space/nearstation) @@ -29530,10 +29797,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) -"iCL" = ( -/obj/machinery/computer/ai_resource_distribution, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "iDf" = ( /obj/effect/turf_decal/trimline/atmos/warning/lower{ dir = 4 @@ -29620,6 +29883,9 @@ }, /obj/item/restraints/handcuffs/cable/zipties, /obj/item/storage/fancy/donut_box, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "iEo" = ( @@ -29669,6 +29935,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"iFp" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "iFF" = ( /obj/effect/turf_decal/trimline/neutral/filled/line/lower{ dir = 1 @@ -29699,10 +29972,10 @@ /turf/closed/wall/r_wall, /area/engine/atmos/storage) "iGl" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/port) "iGm" = ( @@ -29741,15 +30014,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"iGM" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "iGT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29832,12 +30096,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "iIr" = ( @@ -30012,6 +30273,15 @@ }, /turf/open/floor/plasteel, /area/escapepodbay) +"iKT" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "iLf" = ( /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, @@ -30059,6 +30329,12 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/hfr) +"iLV" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "iMn" = ( /obj/structure/grille, /obj/machinery/meter{ @@ -30141,7 +30417,7 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "iNl" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/primary/central) "iNz" = ( @@ -30287,15 +30563,6 @@ }, /turf/open/floor/grass, /area/hydroponics/garden) -"iQl" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "iQm" = ( /obj/structure/window/reinforced/tinted, /obj/structure/toilet{ @@ -30397,12 +30664,12 @@ /obj/machinery/firealarm{ pixel_y = 26 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "iRu" = ( @@ -30508,6 +30775,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/fore) "iSZ" = ( @@ -30535,7 +30803,9 @@ /turf/open/floor/plasteel/dark, /area/bridge) "iTl" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "iTs" = ( @@ -30742,6 +31012,11 @@ "iWn" = ( /turf/open/floor/plasteel/white, /area/security/execution/transfer) +"iWC" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "iWT" = ( /obj/structure/table/reinforced, /obj/machinery/reagentgrinder{ @@ -30858,7 +31133,7 @@ /obj/item/stock_parts/subspace/treatment, /obj/item/stock_parts/subspace/transmitter, /obj/item/stock_parts/subspace/ansible, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel, /area/storage/tech) "iYo" = ( @@ -30991,7 +31266,7 @@ pixel_y = 26 }, /obj/structure/closet/emcloset, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -31132,7 +31407,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, @@ -31220,8 +31495,13 @@ dir = 4; sortType = 19 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/fore) +"jcW" = ( +/obj/structure/cable/white, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "jcY" = ( /obj/effect/turf_decal/tile/darkgreen{ dir = 1 @@ -31442,7 +31722,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/white, @@ -31873,6 +32153,20 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) +"jlj" = ( +/obj/machinery/camera{ + c_tag = "AI Chamber - Port"; + dir = 8; + network = list("aicore") + }, +/obj/machinery/requests_console{ + department = "AI"; + departmentType = 5; + pixel_x = 0; + pixel_y = -32 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "jlo" = ( /obj/structure/flora/ausbushes/ywflowers, /obj/machinery/hydroponics/soil, @@ -31952,6 +32246,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) +"jmj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) "jmo" = ( /obj/machinery/door/window/northleft, /obj/effect/turf_decal/loading_area{ @@ -31999,12 +32299,12 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "jna" = ( @@ -32220,7 +32520,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ @@ -32426,6 +32726,18 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit) +"jsE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"jsH" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "jtz" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 @@ -32477,6 +32789,18 @@ }, /turf/open/floor/plasteel, /area/storage/primary) +"juM" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "juN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -32594,16 +32918,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel/dark, /area/science/server) -"jwC" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "jwI" = ( /obj/machinery/light{ dir = 4 @@ -32819,12 +33133,6 @@ /obj/effect/spawner/structure/window/reinforced/shutter, /turf/open/floor/plating, /area/hallway/primary/central) -"jBI" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/secondarydatacore) "jBS" = ( /obj/structure/rack, /obj/item/soap/deluxe, @@ -32998,15 +33306,6 @@ /obj/effect/turf_decal/trimline/purple/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"jDN" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 8 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "jDR" = ( /obj/structure/cable{ icon_state = "4-8" @@ -33491,12 +33790,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"jMk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "jMl" = ( /obj/structure/closet/secure_closet/freezer/cream_pie, /obj/effect/turf_decal/stripes/line{ @@ -33534,14 +33827,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"jMP" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "jMR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 @@ -33560,7 +33845,7 @@ light_color = "#c1caff" }, /obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel/white, @@ -34023,7 +34308,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, @@ -34319,7 +34604,7 @@ /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/central) "jZs" = ( @@ -34343,10 +34628,28 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) +"jZF" = ( +/obj/structure/frame/machine{ + anchored = 1; + state = 2 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "jZH" = ( /obj/machinery/nuclearbomb/beer, /turf/open/floor/plating, /area/maintenance/port/fore) +"jZO" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/rack, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "jZQ" = ( /obj/structure/chair{ dir = 4 @@ -34549,12 +34852,19 @@ }, /turf/open/floor/plasteel/white, /area/medical/paramedic) -"kcm" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Port to Filter" +"kbV" = ( +/obj/machinery/camera{ + c_tag = "Atmospherics South East"; + dir = 8 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/engine/atmos/pumproom) "kcI" = ( @@ -34947,6 +35257,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/space/has_grav/listeningstation) +"kkR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port) "klf" = ( /obj/machinery/chem_dispenser/drinks/fullupgrade, /obj/structure/table, @@ -35298,6 +35624,12 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/listeningstation) +"kqL" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port) "kqO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/conveyor_switch/oneway{ @@ -35338,21 +35670,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/security/prison) -"krq" = ( -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "ai_core_airlock_interior"; - idSelf = "ai_core_airlock_control"; - pixel_x = -23; - pixel_y = 7 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "krt" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -35451,7 +35768,7 @@ }, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -35602,6 +35919,18 @@ }, /turf/open/floor/plasteel/dark, /area/science/robotics/mechbay) +"ktn" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ktA" = ( /obj/structure/window{ dir = 1 @@ -35682,7 +36011,7 @@ pixel_x = -2; pixel_y = -2 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -36081,12 +36410,12 @@ /area/crew_quarters/locker) "kDD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "kDI" = ( @@ -36102,12 +36431,24 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) -"kDQ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +"kDU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "kEa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -36275,7 +36616,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/structure/window/reinforced{ dir = 1 }, @@ -36459,6 +36800,29 @@ /obj/item/radio/off, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"kKp" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "secondary_aicore_exterior"; + idSelf = "secondary_aicore_controller"; + name = "Secondary AI Core Access Button"; + pixel_x = -8; + pixel_y = -24; + req_one_access_txt = "30;70" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacoreserver) "kKq" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -36726,6 +37090,13 @@ /obj/item/tank/jetpack/carbondioxide, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"kPF" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "kPV" = ( /obj/structure/sign/warning/electricshock{ pixel_y = 32 @@ -36846,7 +37217,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -37116,10 +37487,10 @@ }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/trimline/green/filled/corner/lower, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/turf_decal/trimline/green/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "kXj" = ( @@ -37148,6 +37519,15 @@ /obj/effect/turf_decal/trimline/neutral/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/port) +"kXt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "kXB" = ( /obj/machinery/computer/pandemic, /obj/effect/turf_decal/trimline/green/filled/line/lower{ @@ -37155,20 +37535,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"kXG" = ( -/obj/machinery/camera{ - c_tag = "Atmospherics South East"; - dir = 8 - }, -/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "kXS" = ( /obj/machinery/door/airlock/external{ name = "Russian External Airlock" @@ -37365,12 +37731,12 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/mineral/titanium, /area/teleporter) "lbz" = ( @@ -37578,6 +37944,22 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/bridge) +"lfD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port/aft) "lfU" = ( /obj/structure/reagent_dispensers/cooking_oil, /turf/open/floor/plasteel/showroomfloor, @@ -37597,7 +37979,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "lgi" = ( @@ -37703,6 +38085,12 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/hop) +"liC" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central/secondary) "liD" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -37865,6 +38253,9 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/port) "llU" = ( @@ -37903,6 +38294,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) +"llY" = ( +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) "lmf" = ( /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 4 @@ -38044,6 +38441,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/central/secondary) "lpa" = ( @@ -38118,6 +38518,10 @@ icon_state = "platingdmg1" }, /area/ruin/powered) +"lqk" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port/fore) "lqq" = ( /obj/machinery/firealarm{ pixel_y = 26 @@ -38896,6 +39300,10 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/main) +"lFi" = ( +/obj/machinery/porta_turret/ai, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "lFr" = ( /mob/living/simple_animal/cockroach{ desc = "Virtually unkillable."; @@ -39025,7 +39433,7 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/mineral/titanium, @@ -39064,15 +39472,6 @@ }, /turf/open/space/basic, /area/space) -"lJE" = ( -/obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "lJM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -39378,29 +39777,6 @@ }, /turf/open/floor/wood, /area/library) -"lNz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, -/obj/effect/turf_decal/trimline/atmos/warning/lower/corner, -/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/atmos/warning/lower/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "lNH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -39659,6 +40035,16 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"lRC" = ( +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "AI Chamber - Aft"; + dir = 4; + network = list("aicore") + }, +/obj/machinery/porta_turret/ai, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "lRL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -39944,7 +40330,7 @@ "lVZ" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Four"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -40011,6 +40397,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 6 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/port) "lWZ" = ( @@ -40158,6 +40547,7 @@ pixel_y = -23 }, /obj/structure/cable, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/maintenance/starboard/fore) "lYP" = ( @@ -40270,7 +40660,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, @@ -40317,6 +40707,13 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"maC" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "maT" = ( /obj/effect/mapping_helpers/teleport_anchor, /turf/open/floor/plasteel/dark, @@ -40510,6 +40907,12 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"meo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port) "meq" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance{ @@ -40650,7 +41053,7 @@ /turf/open/floor/plasteel/dark, /area/science/mixing) "mgE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "mgK" = ( @@ -41072,6 +41475,14 @@ }, /turf/open/floor/plasteel, /area/security/execution/transfer) +"mnm" = ( +/obj/machinery/flasher{ + id = "AI"; + pixel_x = 9; + pixel_y = -10 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) "mnq" = ( /obj/structure/flora/ausbushes/reedbush, /turf/open/floor/grass, @@ -41203,6 +41614,15 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"moU" = ( +/obj/machinery/airalarm/tcomms{ + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "moX" = ( /obj/structure/cable{ icon_state = "4-8" @@ -41314,7 +41734,7 @@ "mpS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, @@ -41660,6 +42080,15 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/asteroid, /area/space/nearstation) +"mxb" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "mxe" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -41748,12 +42177,12 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "myI" = ( @@ -41788,7 +42217,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -41925,13 +42354,6 @@ dir = 1 }, /area/engine/engineering) -"mAn" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "mAp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -41940,6 +42362,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/engine/atmos/pumproom) +"mAB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central/secondary) "mAG" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -41949,6 +42377,9 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard) "mAK" = ( @@ -42194,12 +42625,12 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/storage/tech) "mEF" = ( @@ -42332,12 +42763,12 @@ /obj/structure/disposalpipe/junction{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "mGq" = ( @@ -42569,6 +43000,27 @@ }, /turf/open/floor/plasteel, /area/security/execution/transfer) +"mJA" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "secondary_aicore_interior"; + idSelf = "secondary_aicore_controller"; + name = "Secondary AI Core Access Button"; + pixel_x = -24; + pixel_y = -7; + req_one_access_txt = "30;70" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacoreserver) "mJD" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three"; @@ -42602,7 +43054,7 @@ pixel_x = -6; pixel_y = 9 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 8 }, /turf/open/floor/plasteel, @@ -42650,6 +43102,9 @@ /area/quartermaster/office) "mLf" = ( /obj/effect/spawner/lootdrop/maintenance/two, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "mLq" = ( @@ -42860,12 +43315,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"mNw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "mNK" = ( /obj/machinery/recharge_station, /turf/open/floor/plasteel/dark, @@ -43181,6 +43630,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"mSC" = ( +/obj/structure/lattice/catwalk, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai) "mSV" = ( /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -43312,7 +43765,7 @@ /obj/structure/extinguisher_cabinet{ pixel_y = 30 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -43514,32 +43967,12 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"mYn" = ( -/obj/machinery/power/apc/highcap{ - dir = 8; - name = "AI Chamber APC"; - pixel_x = -25 - }, -/obj/structure/cable/white, -/obj/machinery/camera{ - c_tag = "AI Chamber - Aft"; - dir = 4; - network = list("aicore") - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) -"mYt" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - external_pressure_bound = 120 - }, -/obj/machinery/airalarm/tcomms{ - dir = 4; - pixel_x = -24 +"mYq" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) +/turf/open/floor/plating, +/area/maintenance/port) "mYB" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -43553,10 +43986,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"mYG" = ( -/obj/machinery/ai/server_cabinet, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "mYH" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -43906,6 +44335,24 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) +"ncI" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + external_pressure_bound = 120; + name = "server vent" + }, +/obj/structure/cable/white, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "ncK" = ( /obj/machinery/door/airlock/external{ name = "External Access"; @@ -43926,6 +44373,12 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/central) +"nda" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "ndb" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -44001,12 +44454,6 @@ /obj/item/clothing/mask/breath, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/aisat_interior) -"neg" = ( -/obj/machinery/atmospherics/pipe/simple/general/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/secondarydatacore) "nep" = ( /obj/structure/rack, /obj/item/stack/sheet/metal/fifty, @@ -44119,6 +44566,17 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"nfN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "nfO" = ( /obj/structure/chair/office{ dir = 4 @@ -44222,6 +44680,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) +"nhR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central/secondary) "nia" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -44244,10 +44708,10 @@ /turf/open/floor/plasteel, /area/engine/atmos/pumproom) "nif" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/central) "nix" = ( @@ -44453,7 +44917,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness) "nkT" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -44714,13 +45178,6 @@ icon_state = "platingdmg2" }, /area/ruin/powered) -"npS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "npT" = ( /obj/machinery/photocopier, /turf/open/floor/plasteel/bluespace, @@ -44794,10 +45251,10 @@ dir = 8; name = "hallway camera" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/fore) "nrp" = ( @@ -44842,6 +45299,9 @@ }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "nrR" = ( @@ -44905,6 +45365,9 @@ dir = 1 }, /obj/machinery/light/small, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "nsk" = ( @@ -45161,7 +45624,7 @@ pixel_x = -6; pixel_y = -5 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -45271,9 +45734,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/trimline/secred/filled/line/lower{ +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "nyn" = ( @@ -45348,6 +45814,16 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/hallway/primary/central) +"nzK" = ( +/obj/machinery/ai/networking{ + label = "Subcontroller"; + roundstart_connection = "Computer Science - 2" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "nzM" = ( /obj/structure/frame/computer{ dir = 8 @@ -45965,6 +46441,11 @@ /mob/living/simple_animal/cockroach, /turf/open/floor/plasteel/dark, /area/chapel/office) +"nLP" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port) "nLQ" = ( /obj/machinery/computer/monitor{ dir = 1; @@ -46027,12 +46508,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine, /area/maintenance/starboard/fore) -"nNt" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "nNB" = ( /obj/structure/table, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -46298,10 +46773,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/trimline/secred/filled/corner/lower, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/effect/turf_decal/trimline/secred/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/fore) "nRt" = ( @@ -46917,7 +47392,7 @@ c_tag = "Tech Storage"; dir = 5 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 8 }, /turf/open/floor/plasteel, @@ -46976,6 +47451,21 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"oaT" = ( +/obj/machinery/camera{ + c_tag = "AI Chamber - Fore"; + dir = 4; + network = list("aicore") + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/porta_turret/ai, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "oaV" = ( /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -47088,6 +47578,16 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"ocI" = ( +/obj/structure/frame/machine{ + anchored = 1; + state = 2 + }, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "oda" = ( /obj/structure/sign/departments/minsky/engineering/atmospherics{ pixel_y = 32 @@ -47230,18 +47730,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/port/aft) -"ogf" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "ogn" = ( /obj/item/pickaxe, /turf/open/floor/plating/asteroid/airless, @@ -47367,10 +47855,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/auxiliary) -"oiv" = ( -/obj/structure/frame/machine, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "oiJ" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/potato, @@ -47481,8 +47965,8 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "okt" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 10 +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, /turf/open/floor/plasteel/white, /area/medical/storage/backroom) @@ -47515,6 +47999,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"okD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/central) "okF" = ( /obj/structure/cable{ icon_state = "1-4" @@ -47557,6 +48050,24 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) +"olp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "olH" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -47778,6 +48289,9 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "opp" = ( @@ -47904,12 +48418,12 @@ /obj/structure/sign/departments/minsky/medical/virology/virology2{ pixel_y = -32 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/green/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "orA" = ( @@ -48088,6 +48602,9 @@ /obj/item/tank/internals/emergency_oxygen, /turf/open/floor/plasteel/dark, /area/tcommsat/storage) +"otS" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/secondarydatacoreserver) "ous" = ( /obj/machinery/door/airlock/research{ name = "Toxins Storage"; @@ -48326,7 +48843,7 @@ dir = 8 }, /obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -48808,20 +49325,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"oFI" = ( -/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 4; - name = "Waste to Space" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "oFR" = ( /obj/machinery/computer/secure_data{ dir = 1 @@ -48867,6 +49370,19 @@ "oGi" = ( /turf/closed/wall/r_wall, /area/ai_monitored/storage/eva) +"oGk" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "oGo" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 10 @@ -49087,6 +49603,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "oJL" = ( @@ -49260,6 +49779,7 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/fore) "oMk" = ( @@ -49921,14 +50441,11 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, /area/engine/engineering) -"oYb" = ( -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "oYe" = ( /obj/structure/cable{ icon_state = "1-8" @@ -50051,16 +50568,6 @@ }, /turf/open/floor/plating, /area/medical/chemistry) -"pam" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - external_pressure_bound = 120; - name = "server vent" - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "pau" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -50322,6 +50829,12 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"peE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "peG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -50368,10 +50881,10 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/warning/lower, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/janitor) "pfW" = ( @@ -50450,12 +50963,12 @@ /obj/structure/sign/poster/contraband/tools{ pixel_y = 32 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "pgK" = ( @@ -50568,7 +51081,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/door/poddoor/preopen{ id = "Engineering"; @@ -50625,6 +51138,12 @@ }, /turf/open/floor/plasteel, /area/hydroponics) +"pjd" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "pjB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -51248,6 +51767,23 @@ /obj/structure/plasticflaps, /turf/open/floor/plating, /area/quartermaster/storage) +"psa" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "psd" = ( /obj/structure/closet/wardrobe/black, /turf/open/floor/plating, @@ -51337,6 +51873,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port) "ptj" = ( @@ -51944,6 +52481,17 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/medical/medbay/lobby) +"pBP" = ( +/obj/machinery/status_display/ai{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 8; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "pCL" = ( /obj/machinery/deepfryer, /turf/open/floor/plasteel{ @@ -52070,6 +52618,18 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"pFc" = ( +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) +"pFj" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "pFl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -52301,7 +52861,7 @@ pixel_y = -24 }, /obj/structure/closet/firecloset, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/crew_quarters/locker) "pJU" = ( @@ -52428,7 +52988,7 @@ pixel_x = 1; pixel_y = 5 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 10 }, /turf/open/floor/plasteel, @@ -52441,7 +53001,7 @@ /turf/open/floor/engine, /area/engine/engineering) "pLw" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, @@ -52511,6 +53071,21 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) +"pNc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "pNd" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52652,6 +53227,16 @@ }, /turf/open/floor/plating, /area/security/prison) +"pPf" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "pPn" = ( /obj/structure/disposalpipe/segment{ dir = 1 @@ -52735,6 +53320,12 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"pQH" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ai_monitored/secondarydatacoreserver) "pQW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/layer2{ dir = 8 @@ -52777,7 +53368,7 @@ /area/crew_quarters/kitchen) "pRg" = ( /obj/machinery/computer/atmos_alert, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -52825,9 +53416,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) -"pSq" = ( -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "pSt" = ( /turf/open/floor/engine, /area/maintenance/starboard/fore) @@ -52916,6 +53504,9 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "pUk" = ( @@ -52959,12 +53550,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"pUx" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "pUz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53051,7 +53636,7 @@ /area/hallway/secondary/exit) "pVn" = ( /obj/machinery/computer/station_alert, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 9 }, /turf/open/floor/plasteel/dark, @@ -53428,6 +54013,18 @@ /obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos/distro) +"pZV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/ai/networking{ + label = "Main Core"; + roundstart_connection = "Computer Science" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "pZW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -53461,6 +54058,9 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "qaY" = ( @@ -53491,12 +54091,6 @@ /obj/machinery/light, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) -"qbb" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/ai_monitored/secondarydatacore) "qbj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -53817,6 +54411,13 @@ /obj/structure/guillotine, /turf/open/floor/plating, /area/security/execution/transfer) +"qih" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/porta_turret/ai, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "qis" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/holopad, @@ -53840,6 +54441,18 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) +"qiH" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "qiJ" = ( /obj/structure/door_assembly/door_assembly_mhatch, /obj/machinery/door/firedoor/border_only{ @@ -53884,6 +54497,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "qiZ" = ( @@ -54344,6 +54960,16 @@ name = "Ice Sheet" }, /area/space/nearstation) +"qqe" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port/fore) "qqj" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -54444,12 +55070,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/brig) "qrP" = ( @@ -54515,12 +55141,12 @@ }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "qtt" = ( @@ -54547,7 +55173,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "qtM" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, @@ -54606,13 +55232,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/asteroid, /area/space/nearstation) -"quS" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/ai_monitored/secondarydatacore) "quU" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 8 @@ -55255,14 +55874,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos/hfr) -"qHp" = ( -/obj/machinery/camera{ - c_tag = "AI Chamber - Port"; - dir = 8; - network = list("aicore") - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "qHx" = ( /obj/structure/sign/warning/fire{ pixel_y = 32 @@ -55462,20 +56073,6 @@ }, /turf/open/floor/plasteel, /area/security/execution/transfer) -"qLW" = ( -/obj/machinery/power/smes/engineering{ - charge = 5e+006; - input_level = 25000; - output_level = 25000 - }, -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "qLY" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -55489,6 +56086,13 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"qMj" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port) "qMm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -55652,13 +56256,6 @@ name = "Ice Sheet" }, /area/space/nearstation) -"qOp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/ai/data_core/primary, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "qOs" = ( /obj/effect/turf_decal/tile/dark/half/contrasted, /obj/effect/decal/cleanable/dirt, @@ -55808,6 +56405,18 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/asteroid, /area/space/nearstation) +"qQH" = ( +/obj/structure/disposalpipe/segment{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "qQM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -55988,6 +56597,7 @@ /obj/structure/cable{ icon_state = "2-8" }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/fore) "qTt" = ( @@ -56017,6 +56627,12 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/hos) +"qTz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "qTG" = ( /obj/machinery/computer/secure_data{ dir = 8 @@ -56133,10 +56749,10 @@ /obj/effect/turf_decal/trimline/brown/filled/line/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/machinery/light{ dir = 1 }, -/obj/machinery/light{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -56221,7 +56837,7 @@ name = "Tech Storage APC"; pixel_y = 23 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel, @@ -57146,10 +57762,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"rkQ" = ( -/obj/machinery/holopad, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "rkT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -57477,7 +58089,7 @@ /area/crew_quarters/heads/chief) "rqf" = ( /obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -57706,6 +58318,9 @@ }, /turf/open/floor/wood, /area/maintenance/port/aft) +"rsW" = ( +/turf/open/floor/plasteel/dark, +/area/science/server) "rsX" = ( /obj/machinery/vending/coffee, /turf/open/floor/carpet/black, @@ -58111,12 +58726,12 @@ /obj/machinery/computer/warrant{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/fore) "ryv" = ( @@ -58127,6 +58742,17 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating/asteroid, /area/space/nearstation) +"ryN" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = 8; + pixel_y = -23 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "rzf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 @@ -58161,6 +58787,19 @@ }, /turf/open/space/basic, /area/space/nearstation) +"rAd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port/fore) "rAp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -58252,7 +58891,7 @@ /obj/machinery/light{ light_color = "#c1caff" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -58316,12 +58955,12 @@ /obj/effect/turf_decal/trimline/brown/filled/corner/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, /obj/machinery/firealarm{ pixel_y = 26 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/quartermaster/sorting) "rDW" = ( @@ -58767,7 +59406,7 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/neutral/filled/corner/lower{ +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -58806,6 +59445,14 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/hallway/primary/central) +"rLp" = ( +/obj/item/stack/cable_coil, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "rLv" = ( /obj/machinery/light/floor, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -58839,6 +59486,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"rLO" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port) "rLR" = ( /obj/effect/mapping_helpers/teleport_anchor, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -59159,18 +59810,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"rQk" = ( -/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "rQo" = ( /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 @@ -59351,6 +59990,15 @@ "rSp" = ( /turf/open/floor/eighties, /area/maintenance/starboard/fore) +"rSq" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "rSv" = ( /obj/item/radio/intercom{ pixel_y = -30 @@ -59362,7 +60010,7 @@ /obj/structure/extinguisher_cabinet{ pixel_y = -30 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/central) "rTe" = ( @@ -59490,6 +60138,14 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) +"rUs" = ( +/obj/structure/window/reinforced, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) "rUt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light{ @@ -59620,15 +60276,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"rVZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "rWd" = ( /obj/machinery/door/airlock/external{ name = "MiniSat External Access"; @@ -60120,7 +60767,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -60264,6 +60911,9 @@ /area/hallway/primary/starboard) "sdZ" = ( /obj/structure/closet/emcloset, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/central) "sei" = ( @@ -60316,7 +60966,7 @@ pixel_x = 27 }, /obj/effect/turf_decal/trimline/secred/filled/corner/lower, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, @@ -60474,10 +61124,10 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "siH" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/port) "siN" = ( @@ -60489,6 +61139,9 @@ /area/medical/virology) "sjf" = ( /obj/machinery/computer/message_monitor, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "sjj" = ( @@ -60732,7 +61385,7 @@ /turf/open/floor/plasteel/white, /area/science/explab) "snA" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -60800,6 +61453,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/fore) "soI" = ( @@ -60855,7 +61509,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -61006,6 +61660,17 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"srd" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Port to Filter" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "srg" = ( /obj/effect/turf_decal/trimline/green/filled/line/lower{ dir = 5 @@ -61033,10 +61698,12 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "srO" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower, /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "srW" = ( @@ -61067,16 +61734,6 @@ }, /turf/open/floor/eighties, /area/maintenance/starboard/fore) -"sss" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "ssE" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -30 @@ -61432,7 +62089,7 @@ /obj/structure/disposalpipe/segment{ dir = 2 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, @@ -61534,6 +62191,31 @@ /obj/item/reagent_containers/food/snacks/bait/type, /turf/open/floor/plating/asteroid, /area/space/nearstation) +"szu" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + id_tag = "ai_core_airlock_exterior"; + name = "AI Core"; + req_access_txt = "65" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "aicoredoor"; + name = "AI Chamber entrance shutters" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "szX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 8 @@ -61774,7 +62456,7 @@ pixel_x = -3; pixel_y = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel, /area/storage/tech) "sDa" = ( @@ -61845,13 +62527,13 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 1 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/security/brig) "sDS" = ( @@ -62071,7 +62753,7 @@ icon_state = "0-8" }, /obj/effect/turf_decal/trimline/purple/filled/corner/lower, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel/white, @@ -62205,6 +62887,13 @@ /obj/effect/turf_decal/trimline/brown/warning/lower, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"sJr" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "sJB" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -62224,10 +62913,10 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, /turf/open/floor/plasteel, /area/storage/tech) "sKc" = ( @@ -62255,6 +62944,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "sKr" = ( @@ -62336,6 +63028,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/hallway/primary/port) "sKT" = ( @@ -62438,6 +63134,18 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/hop) +"sMi" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 4; + external_pressure_bound = 120 + }, +/obj/machinery/airalarm/tcomms{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "sMp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -62459,10 +63167,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) -"sMB" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "sMH" = ( /obj/effect/turf_decal/trimline/green/filled/line/lower, /turf/open/floor/plasteel, @@ -62750,12 +63454,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"sQV" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 8 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "sRa" = ( /obj/structure/cable{ icon_state = "1-4" @@ -62835,10 +63533,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/pumproom) -"sSc" = ( -/obj/machinery/ai/server_cabinet/prefilled, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "sSe" = ( /obj/machinery/rnd/destructive_analyzer, /obj/machinery/newscaster{ @@ -63182,6 +63876,21 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"sXO" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "sXS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -63206,15 +63915,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/carpet, /area/crew_quarters/fitness) -"sYw" = ( -/obj/machinery/airalarm/tcomms{ - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "sYM" = ( /obj/effect/turf_decal/trimline/dark_blue/warning/lower, /turf/open/floor/plasteel, @@ -63445,7 +64145,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, @@ -63465,6 +64165,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"tcu" = ( +/obj/structure/closet/secure_closet/RD, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/hor) "tcz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -63545,6 +64252,22 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /turf/open/floor/plasteel, /area/hallway/primary/central) +"tdy" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8; + external_pressure_bound = 140; + pressure_checks = 0 + }, +/obj/machinery/camera{ + c_tag = "Secondary AI Core"; + dir = 8; + network = list("ss13","rd") + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "tdD" = ( /obj/item/reagent_containers/syringe{ desc = "A syringe, looks like someone used it to inject weed into themselves."; @@ -63579,7 +64302,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/crew_quarters/fitness) "tdR" = ( @@ -63710,6 +64433,13 @@ }, /turf/open/floor/wood, /area/hallway/secondary/entry) +"tgx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/port) "tgA" = ( /obj/structure/bed/roller, /obj/effect/turf_decal/trimline/purple/filled/line/lower{ @@ -63755,22 +64485,6 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) -"thu" = ( -/obj/machinery/door/airlock/public{ - id_tag = "ai_core_airlock_interior" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "thx" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/bottle/whiskey, @@ -63857,10 +64571,10 @@ /turf/open/floor/plating, /area/engine/engineering) "tiZ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/machinery/light{ dir = 1 }, -/obj/machinery/light{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -63899,7 +64613,7 @@ /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -63957,7 +64671,7 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel/white, @@ -64204,6 +64918,12 @@ /obj/item/toy/plush/nukeplushie, /turf/open/floor/plating, /area/maintenance/central) +"tpJ" = ( +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) "tpN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -64302,6 +65022,21 @@ }, /turf/open/floor/plasteel, /area/security/warden) +"trc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "trv" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -64539,6 +65274,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"tuU" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "tuV" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -64750,7 +65491,7 @@ /obj/structure/table, /obj/item/stock_parts/micro_laser/high, /obj/item/stock_parts/manipulator/nano, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 9 }, /turf/open/floor/plasteel, @@ -64761,6 +65502,14 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) +"tyr" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "tyx" = ( /obj/structure/table, /obj/item/electropack, @@ -64918,6 +65667,15 @@ }, /turf/open/floor/plating, /area/security/prison) +"tBg" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "tBs" = ( /obj/machinery/firealarm{ dir = 4; @@ -65300,7 +66058,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "tGV" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -65311,6 +66069,14 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"tHs" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/ai/server_cabinet/prefilled, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "tHx" = ( /obj/structure/cable{ icon_state = "1-2" @@ -65549,7 +66315,7 @@ dir = 4; pixel_y = 37 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -65571,6 +66337,24 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) +"tLt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "tLH" = ( /obj/effect/turf_decal/stripes{ dir = 6 @@ -65671,6 +66455,10 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"tOv" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/central/secondary) "tOw" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Monitoring Room"; @@ -65881,6 +66669,15 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) +"tQt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "tQu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -65901,11 +66698,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/quartermaster/storage) -"tQR" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/light, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "tQW" = ( /obj/machinery/chem_dispenser/drinks/beer, /obj/structure/table, @@ -66283,6 +67075,13 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"tVS" = ( +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "tWc" = ( /obj/machinery/atmospherics/pipe/layer_manifold, /obj/structure/cable{ @@ -66297,7 +67096,7 @@ /turf/open/floor/plating, /area/maintenance/solars/port/fore) "tWu" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -66328,9 +67127,12 @@ /turf/open/floor/plasteel/white, /area/medical/storage/backroom) "tWL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "tWV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -66394,6 +67196,21 @@ /obj/machinery/power/emitter, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"tYk" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "tYn" = ( /obj/structure/cable{ icon_state = "1-4" @@ -66450,6 +67267,12 @@ }, /turf/open/floor/plasteel, /area/engine/engine_smes) +"tYC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "tYE" = ( /obj/machinery/computer/cargo/request{ dir = 4 @@ -66521,7 +67344,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -66623,6 +67446,12 @@ /obj/effect/turf_decal/trimline/purple/filled/line/lower, /turf/open/floor/plasteel/white, /area/science/explab) +"ubn" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "ubI" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -67410,25 +68239,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"uod" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ - dirx = -2; - diry = -1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/airlock/command/glass{ - id_tag = "secondary_aicore_exterior"; - name = "Physical Core Access"; - req_one_access_txt = "30;70" - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "uoh" = ( /obj/structure/closet/secure_closet/brig, /obj/machinery/button/door{ @@ -67649,6 +68459,18 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"urk" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "uro" = ( /obj/effect/turf_decal/sand, /obj/structure/disposalpipe/segment{ @@ -67751,7 +68573,7 @@ }, /obj/machinery/door/airlock{ name = "Service Hall"; - req_one_access_txt = "25;26;35;28;46;37;38;36" + req_access_txt = "79" }, /obj/structure/cable{ icon_state = "4-8" @@ -68108,7 +68930,7 @@ /turf/open/floor/noslip, /area/engine/engineering) "uAW" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/aft) "uBf" = ( @@ -68144,14 +68966,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"uBA" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) "uBL" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/structure/reagent_dispensers/fueltank, @@ -68187,7 +69001,7 @@ /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -68425,12 +69239,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"uFS" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "uGf" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -68649,6 +69457,12 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"uJh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "uJN" = ( /obj/structure/filingcabinet, /obj/structure/window{ @@ -68726,12 +69540,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "uLk" = ( @@ -68803,12 +69617,6 @@ }, /turf/open/floor/wood, /area/bridge/meeting_room) -"uNh" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "uNI" = ( /obj/structure/toilet_bong{ flags_1 = 128 @@ -68920,6 +69728,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"uPr" = ( +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "uPs" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -69007,7 +69818,7 @@ "uQO" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/techstorage/security, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -69074,14 +69885,6 @@ }, /turf/open/floor/carpet/black, /area/tcommsat/computer) -"uRH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "uRP" = ( /obj/machinery/light, /obj/effect/landmark/start/roboticist, @@ -69390,6 +70193,10 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"uYQ" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "uYT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -69532,7 +70339,7 @@ "vak" = ( /obj/effect/spawner/lootdrop/techstorage/rnd, /obj/structure/rack, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 6 }, /turf/open/floor/plasteel, @@ -69913,6 +70720,7 @@ /area/maintenance/starboard/aft) "vif" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/landmark/xeno_spawn, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "vig" = ( @@ -70108,6 +70916,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "vlg" = ( @@ -70185,6 +70996,12 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"vmt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/central) "vmz" = ( /obj/structure/rack, /obj/item/restraints/legcuffs/beartrap, @@ -70309,6 +71126,12 @@ }, /turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) +"vpN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "vql" = ( /obj/structure/table/reinforced, /obj/item/folder/yellow, @@ -70355,6 +71178,12 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/paramedic) +"vrk" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "vrA" = ( /obj/structure/chair/stool/bar, /obj/effect/decal/cleanable/dirt, @@ -70504,12 +71333,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) -"vte" = ( -/obj/machinery/atmospherics/pipe/manifold/general/hidden{ - dir = 1 - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/secondarydatacore) "vtx" = ( /obj/structure/cable{ icon_state = "4-8" @@ -71055,6 +71878,12 @@ }, /turf/open/floor/plasteel, /area/clerk) +"vAF" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) "vAT" = ( /obj/structure/disposalpipe/junction/yjunction{ dir = 4 @@ -71203,7 +72032,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -71267,15 +72096,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/storage) -"vFX" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "vGc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -71334,22 +72154,6 @@ icon_state = "sandwater_b" }, /area/crew_quarters/bar) -"vGH" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8; - external_pressure_bound = 140; - pressure_checks = 0 - }, -/obj/machinery/camera{ - c_tag = "Secondary AI Core"; - dir = 8; - network = list("ss13","rd") - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "vHg" = ( /turf/open/floor/wood, /area/crew_quarters/heads/captain) @@ -71486,13 +72290,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) -"vKE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold4w/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "vKH" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/start/cargo_technician, @@ -71553,6 +72350,15 @@ dir = 8 }, /area/hallway/secondary/exit) +"vLk" = ( +/obj/machinery/status_display/ai{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "vLv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 @@ -71792,7 +72598,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -71924,6 +72730,27 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"vRM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/yellow/visible{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, +/obj/effect/turf_decal/trimline/atmos/warning/lower/corner, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "vRT" = ( /obj/structure/closet, /obj/item/storage/box/donkpockets, @@ -72014,16 +72841,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"vSY" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "vTl" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -72044,7 +72861,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -72134,6 +72951,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/security/prison) +"vUF" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ai_monitored/secondarydatacoreserver) "vUM" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/manifold/general/visible, @@ -72156,15 +72980,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/security/courtroom) -"vUY" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 8 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "vVb" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/air_input{ id = "o2_in"; @@ -72275,6 +73090,12 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "vYq" = ( @@ -72610,10 +73431,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/security/brig) "wcJ" = ( @@ -72827,6 +73648,17 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"wfH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "wfQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ @@ -73074,6 +73906,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/port/fore) "wjR" = ( @@ -73162,7 +73997,7 @@ /area/crew_quarters/fitness) "wlb" = ( /obj/structure/closet/emcloset, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -73528,7 +74363,7 @@ persistence_id = "public"; pixel_y = 32 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -73554,6 +74389,7 @@ name = "Kitchen APC"; pixel_y = -23 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/maintenance/port/fore) "wrl" = ( @@ -73766,6 +74602,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) +"wuA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "wuC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -73786,27 +74628,6 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) -"wvd" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_interior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -24; - pixel_y = -7; - req_one_access_txt = "30;70" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "wvh" = ( /obj/effect/decal/cleanable/dirt, /mob/living/simple_animal/cockroach, @@ -73900,22 +74721,6 @@ }, /turf/open/floor/plasteel/white, /area/engine/atmos/pumproom) -"wwE" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "wwI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -74060,25 +74865,16 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "wyV" = ( /obj/structure/table, -/obj/item/cartridge/quartermaster{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/cartridge/quartermaster{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/cartridge/quartermaster, /obj/item/coin/silver{ pixel_x = -3 }, @@ -74270,6 +75066,76 @@ }, /turf/open/floor/plasteel, /area/security/main) +"wAC" = ( +/obj/machinery/doorButtons/access_button{ + idDoor = "secondary_aicore_exterior"; + idSelf = "secondary_aicore_controller"; + name = "Secondary AI Core Access Button"; + pixel_x = -7; + pixel_y = -24; + req_one_access_txt = "30;70" + }, +/obj/machinery/doorButtons/airlock_controller{ + idExterior = "secondary_aicore_exterior"; + idInterior = "secondary_aicore_interior"; + idSelf = "secondary_aicore_controller"; + name = "Secondary AI Core Access Console"; + pixel_x = 6; + pixel_y = -26; + req_one_access_txt = "30;70" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/secondarydatacoreserver) +"wAE" = ( +/obj/machinery/ai/data_core/primary, +/obj/machinery/power/apc/highcap{ + dir = 8; + name = "AI Chamber APC"; + pixel_x = -25 + }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/item/radio/intercom{ + anyai = 1; + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_y = -27 + }, +/obj/item/radio/intercom{ + anyai = 1; + broadcasting = 0; + freerange = 1; + frequency = 1447; + name = "Private Channel"; + pixel_y = 20 + }, +/obj/item/radio/intercom{ + broadcasting = 0; + freerange = 1; + listening = 1; + name = "Common Channel"; + pixel_y = -37 + }, +/obj/machinery/turretid{ + icon_state = "control_stun"; + name = "AI Chamber turret control"; + pixel_x = -1; + pixel_y = 38 + }, +/obj/machinery/button/door{ + id = "aicoredoor"; + name = "AI Chamber entrance shutters control"; + pixel_x = -23; + pixel_y = 21; + req_access_txt = "16" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "wAU" = ( /obj/machinery/atmospherics/components/unary/tank/air{ dir = 1; @@ -74316,7 +75182,7 @@ "wBF" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/techstorage/tcomms, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -74420,15 +75286,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/storage) -"wCh" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "wCt" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4 @@ -74531,13 +75388,13 @@ /turf/open/floor/plating, /area/quartermaster/warehouse) "wDH" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, /obj/machinery/vending/snack/random, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "wDL" = ( @@ -74590,13 +75447,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/hfr) -"wEl" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "wEq" = ( /obj/machinery/light{ dir = 1 @@ -74731,19 +75581,6 @@ }, /turf/open/floor/carpet/blue, /area/bridge/meeting_room) -"wFV" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel, -/area/engine/atmos/pumproom) "wFY" = ( /obj/structure/table, /obj/item/folder/yellow, @@ -75224,18 +76061,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"wOi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "wOj" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ @@ -75312,7 +76137,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/engineering) "wPm" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel, @@ -75475,7 +76300,7 @@ /area/engine/engineering) "wSg" = ( /obj/machinery/light, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -75592,7 +76417,7 @@ /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -75809,6 +76634,20 @@ }, /turf/open/floor/eighties, /area/maintenance/starboard/fore) +"wWa" = ( +/obj/machinery/power/smes/engineering{ + charge = 5e+006; + input_level = 25000; + output_level = 20000 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "wWj" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -76041,7 +76880,7 @@ /area/maintenance/starboard/aft) "wZX" = ( /obj/machinery/power/apc/highcap{ - areastring = "/area/ai_monitored/secondarydatacore"; + areastring = "/area/ai_monitored/secondarydatacoreserver"; dir = 4; name = "AI Secondary Datacore"; pixel_x = 24 @@ -76149,12 +76988,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit) -"xcx" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 1 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "xcB" = ( /turf/template_noop, /area/space) @@ -76206,6 +77039,17 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/maintenance/central) +"xdW" = ( +/obj/machinery/status_display/ai{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 4; + external_pressure_bound = 120; + name = "server vent" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "xdY" = ( /obj/structure/barricade/wooden, /obj/machinery/door/airlock/maintenance_hatch, @@ -76225,17 +77069,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"xeu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 8; - external_pressure_bound = 120; - name = "server vent" - }, -/obj/machinery/status_display/ai{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "xeC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 1 @@ -76362,15 +77195,15 @@ /turf/open/floor/grass/snow/safe, /area/ruin/space/has_grav/listeningstation) "xga" = ( -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) "xgg" = ( @@ -76459,7 +77292,7 @@ /obj/machinery/camera{ c_tag = "Arrivals Lounge" }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel, @@ -76594,6 +77427,16 @@ /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel, /area/engine/foyer) +"xkP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 2 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "xkS" = ( /obj/structure/disposalpipe/segment{ dir = 2 @@ -76700,7 +77543,7 @@ /obj/machinery/computer/med_data{ dir = 8 }, -/obj/effect/turf_decal/trimline/neutral/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -76958,6 +77801,30 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/central) +"xsy" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"xsA" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "xsF" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8 @@ -77017,6 +77884,15 @@ /obj/effect/spawner/lootdrop/maintenance/three, /turf/open/floor/plating, /area/maintenance/port) +"xuh" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "xum" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 1 @@ -77148,6 +78024,9 @@ /obj/structure/disposalpipe/segment{ dir = 2 }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "xvF" = ( @@ -77294,6 +78173,13 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel, /area/security/prison) +"xyt" = ( +/obj/machinery/ai/master_subcontroller, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacoreserver) "xyw" = ( /obj/machinery/atmospherics/components/unary/tank/toxins{ dir = 4 @@ -77629,6 +78515,9 @@ /obj/machinery/light/small{ dir = 8 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/central/secondary) "xCH" = ( @@ -77657,7 +78546,7 @@ /turf/open/floor/plasteel, /area/engine/atmos/hfr) "xDE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, @@ -77925,7 +78814,7 @@ /turf/open/floor/plating, /area/quartermaster/office) "xIK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, /turf/open/floor/plasteel, @@ -78170,14 +79059,13 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/yellow/warning/lower, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/primary/aft) "xLI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 }, -/obj/effect/landmark/xeno_spawn, /turf/open/floor/plasteel, /area/engine/atmos/hfr) "xLQ" = ( @@ -78265,7 +79153,7 @@ }, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_one_access_txt = "10;61" + req_one_access_txt = "10" }, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -78351,6 +79239,15 @@ /obj/effect/turf_decal/trimline/green/warning/lower, /turf/open/floor/plasteel/white, /area/medical/virology) +"xOB" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "xOD" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -78596,6 +79493,15 @@ }, /turf/open/floor/plating, /area/maintenance/central) +"xSH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "xTc" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -78654,7 +79560,7 @@ pixel_x = 9; pixel_y = -1 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 8 }, /turf/open/floor/plasteel, @@ -78951,6 +79857,20 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port) +"xYM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 + }, +/turf/open/floor/plating, +/area/maintenance/central) +"xYX" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "xZe" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -79108,6 +80028,12 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) +"ybh" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/pumproom) "ybn" = ( /obj/item/key/janitor, /obj/structure/table/wood, @@ -79177,7 +80103,7 @@ /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/suit/hazardvest, /obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel, /area/storage/tech) "ycr" = ( @@ -79444,6 +80370,21 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload_foyer) +"yfC" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "yfE" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=Research Division"; @@ -79796,6 +80737,19 @@ name = "Ice Sheet" }, /area/space/nearstation) +"ymi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) (1,1,1) = {" acb @@ -88379,7 +89333,7 @@ avw avw anm aOS -sRv +qqe aao eEO azG @@ -88893,7 +89847,7 @@ avA avA anm aao -lkU +yfC aao myS azG @@ -89679,9 +90633,9 @@ azG azG azG azG -tWL +mZR aJI -aoq +mYq aoq aoq aoq @@ -89938,7 +90892,7 @@ xRH jcB iid qmH -mDS +kkR mDS hjR mDS @@ -90178,7 +91132,7 @@ aUe aUe sRv cjW -lkU +rAd aLR wTt aUZ @@ -90955,9 +91909,9 @@ dof dof dof kHO -aUe +bds jky -enU +ntf pbJ sem sWZ @@ -91785,9 +92739,9 @@ aoq aoq aoq lMf -aoq +rLO lWV -aEb +hem aEb aEb aBF @@ -94598,7 +95552,7 @@ aHv trN aJI aoq -nzr +tgx agG rDN hff @@ -95112,7 +96066,7 @@ aHv aHv aJI lOa -aoq +kqL agG qVV sDB @@ -96624,7 +97578,7 @@ keP aii pJO ajM -knl +qMj knl aoq knl @@ -96881,14 +97835,14 @@ aii aii iTl alR +meo aoq aoq aoq aoq -aoq -aoq -aoq -aoq +rLO +gks +mYq osq acb aNg @@ -96906,9 +97860,9 @@ aHv aHv aHv aJI -knl -aoq -aoq +nLP +gks +mYq aJI fWF sZm @@ -97113,7 +98067,7 @@ aqy aao aUe aUe -aUe +gYG asg olJ tkm @@ -97407,9 +98361,9 @@ aAw aAw aAw jOx -aAw +ixW vYd -aAw +ixW aAw aAw aAw @@ -98435,8 +99389,8 @@ kWO jLz eXk sdZ -pbC -xSo +okD +bmF rok fFP uxp @@ -99478,7 +100432,7 @@ ibk ibk xSo tJy -ibk +xYM end qtM sZm @@ -100196,7 +101150,7 @@ vUv vUv vUv gTd -rPj +gMb aFi kvq nRV @@ -101223,7 +102177,7 @@ aqy aqy aqy aao -rPj +gMb aFi xAE cum @@ -101291,9 +102245,9 @@ aKc agH aPk sWs -uBx -iVi -aQo +ktn +qiH +tuU aQo aQo aPk @@ -101737,7 +102691,7 @@ oUI oUI xKV aao -rPj +tLt aFi eMm tFL @@ -102298,8 +103252,8 @@ uxp uxp fFP hFM -ibk -ibk +jmj +vmt fFP uxp uxp @@ -102309,9 +103263,9 @@ uxp fFP oIN nsk -iNl +nda oQP -aQo +jsE aQo aQo aQo @@ -102529,7 +103483,7 @@ wmn wPQ xNo ykJ -aFd +llY aFd rkL dMu @@ -102812,7 +103766,7 @@ bSV otQ nGS sjf -isK +ngf ggA kgM eAv @@ -103043,7 +103997,7 @@ rLb jFv xNo aQG -aFd +tpJ dTE wVc bIw @@ -103280,7 +104234,7 @@ aqy aqy aao aOS -rmz +kDU aDP aDP jVf @@ -103857,7 +104811,7 @@ aKc aKc aKc aPk -onq +qQH aPk aKc aKc @@ -103865,8 +104819,8 @@ aKc aKc aKc aPk -aQo -aQo +vpN +xsy aPk aKc aKc @@ -104071,7 +105025,7 @@ oGC obp jgE pVn -aFd +gkx cAa qBh uvM @@ -104387,7 +105341,7 @@ gwP aeC uAW aPk -aQo +xsy aQo aQo aPk @@ -104585,7 +105539,7 @@ aQU wPQ jgE baZ -aFd +vAF aFd dps efF @@ -104644,7 +105598,7 @@ eWv fNN xLG bxQ -xXG +nfN xXG hkv aPk @@ -104901,7 +105855,7 @@ pEm nvj cpB aPk -aQo +tuU aQo lgU gJg @@ -105834,7 +106788,7 @@ tOY yft abp dSn -aUe +lqk sKm aFr aFr @@ -106133,7 +107087,7 @@ ptr xNI aCG loY -jOQ +mAB aKX rlJ rlJ @@ -106413,7 +107367,7 @@ qtk gMC iNl jBu -jOQ +cTe bRm rtk fIP @@ -106674,7 +107628,7 @@ poL iaa jYa poL -jOQ +liC poL iRq dKF @@ -106875,7 +107829,7 @@ rft rft ayi aFr -gLJ +trc ape csz aYf @@ -107132,7 +108086,7 @@ rft rft xXv aFr -lkU +enU ape eeE tBK @@ -108497,7 +109451,7 @@ uKg eYl cwk aPk -cBy +bEq aQo aPk aPk @@ -108674,7 +109628,7 @@ xie mZp hqB aKh -vNX +olp axP twp xEk @@ -108690,7 +109644,7 @@ gjq gjq gjq gjq -gjq +xSH ycw jbn aiZ @@ -108723,7 +109677,7 @@ aFu aFu adX xCx -jOQ +efc poL vdX vTK @@ -109011,7 +109965,7 @@ qtf cZd rCs aPk -cBy +pNc aQo aPk msb @@ -109188,7 +110142,7 @@ xie aIW led aKh -vNX +fam axP xRU axP @@ -109702,7 +110656,7 @@ sAE lXf cBB aKh -vNX +ghf neC xRU axP @@ -110269,9 +111223,9 @@ poL poL poL yja -jOQ -jOQ -jOQ +tOv +nhR +mAB pdO poL xlW @@ -110809,7 +111763,7 @@ llW aGU aGU aGU -sZv +jZO lMI aPk aPk @@ -111066,7 +112020,7 @@ pSJ hjO okt aGa -aQo +jsE lMI aPk aKc @@ -111312,7 +112266,7 @@ uOZ xOD fbq qol -sXq +gau taH jbG wOM @@ -111323,7 +112277,7 @@ qIO aqJ jNh wOM -aQo +tuU lMI rMm aKc @@ -111744,9 +112698,9 @@ bCM pXF oVi aQv -arK -aZH -aZH +tWL +uJh +gTg axP ina eYe @@ -111760,7 +112714,7 @@ aZH oGi oGi oGi -ksg +ymi axP iZF njj @@ -112094,10 +113048,10 @@ tJv yit thW wOM -aQo -lgU +vpN +lfD qiS -lve +hKW opf opf lve @@ -113034,7 +113988,7 @@ oyQ axP axP hBP -gjq +kPF dFy qkr ucA @@ -114157,7 +115111,7 @@ eaJ sBc dNZ aVN -rmQ +dmF ajz baa mDu @@ -114607,7 +115561,7 @@ eve aiZ dBt hyX -cEO +tcu fwl uLP bWr @@ -115134,7 +116088,7 @@ wZX qcK ecO pVu -hQM +epK gnV tLH aPQ @@ -115385,11 +116339,11 @@ iVx etS wMr ubf -amR -amR -amR -amR -amR +otS +otS +otS +otS +otS rFh aCb aCb @@ -115642,14 +116596,14 @@ vUC hyX ehV ubf -amR -aAn -mYt -wvd -grc +otS +gdS +sMi +mJA +dFc hNQ aGP -akg +rsW smv eTo aCb @@ -115698,8 +116652,8 @@ hSu dHE gZe aaj -ogK -rGB +gmi +eFc ajz eIi xNJ @@ -115899,11 +116853,11 @@ tvU hyX sXe ubf -amR -aZV -eQt -hik -neg +otS +uPr +sJr +kKp +gda vsP qOJ riV @@ -116156,12 +117110,12 @@ sPG sPG wlW ubf -amR -aAn -jMP -uod -vte -quS +otS +nzK +fuA +eEq +gHW +vUF jgP uZm vUM @@ -116413,12 +117367,12 @@ jrS dHh uaH rkx -amR -mYG -vGH -bBq -jBI -qbb +otS +xyt +tdy +wAC +iqE +pQH aCb ffG fne @@ -116644,7 +117598,7 @@ rOB rXC rXC vqC -rXC +sXO cYl ent aRh @@ -116968,9 +117922,9 @@ abh abh agn agn -aHe +xYX hpz -lUD +tBg lUD lUD lUD @@ -117934,7 +118888,7 @@ aZH aZH aZH ckQ -dJH +fsb asi gQG rKM @@ -117942,7 +118896,7 @@ tPT dUR asi rly -aZH +wuA axP wyS xRz @@ -118709,9 +119663,9 @@ aZH aZH neC biy -aZH +uYQ bfm -aZH +pjd nnp qwz axP @@ -119777,7 +120731,7 @@ qDa qbj aYx afp -nBt +tQt aoJ agn agn @@ -121071,8 +122025,8 @@ aJj aJj aJj dkB -cse -cse +tVS +dFP cse rva tcg @@ -122810,7 +123764,7 @@ axP aZH jgk axP -aZH +uYQ mLf aJn aYN @@ -123859,7 +124813,7 @@ ajX ajX abM npb -dtk +hAt dtk dtk aOl @@ -125157,9 +126111,9 @@ wbN ewA mzk iQP -pSq +qTz kHx -pSq +tYC aNQ iMH iYL @@ -125414,9 +126368,9 @@ mVg puq mAp fWL +cdr cNV -cNV -uRH +irx xTh nzV eTd @@ -126184,12 +127138,12 @@ fpN gwj fnN ttI -sss -vKE -vKE -npS -asM -dte +hMk +fPx +fPx +mfZ +ybh +fWH bPN wwm aYa @@ -126697,13 +127651,13 @@ acb fpN yks oqD -ttI -hMk -mfZ -kcm -fPx -fPx -wFV +xkP +pPf +fNL +srd +fIR +iWC +wfH uXs bmS hiX @@ -126956,7 +127910,7 @@ rBS dKN xBR uZq -hay +cCO xri jar jar @@ -127213,11 +128167,11 @@ syl rCX nie xpM -oFI -wwE -kXG -rQk -lNz +atL +psa +kbV +oGk +vRM whi szX hiX @@ -127727,7 +128681,7 @@ aNg aNg aNg aNg -uBA +rUs ete iCp tZM @@ -136284,9 +137238,9 @@ rwD aYj aYj aYj -iCL lPZ -aoX +lPZ +lPZ aLi sjG sjG @@ -136790,15 +137744,15 @@ aNg sjG abZ abZ -abZ aYj aYj aYj -thu +aYj +szu +aYj aYj aYj aYj -aLi mpf aLi aLi @@ -137048,13 +138002,13 @@ aNg uqT aYj aYj -vSY -cWk -dEj -dLt -krq -mYn -hJg +oaT +hVW +vrk +juM +dOc +hVW +lRC aYj wJR aYj @@ -137305,13 +138259,13 @@ sjG aYj aYj aYj -sYw -rVZ -vFX -ogf -dTL -oYb -kDQ +moU +eQu +peE +jsH +fhe +fhe +xdW aYj aYj aYj @@ -137561,15 +138515,15 @@ sjG sjG aYj aYj -sSc -sQV -mAn -hVW -iQl -nNt -uFS +pZV +iFp +ryN +aYj +aYj +mnm +fhe fAz -oiv +tHs aYj aYj sjG @@ -137818,15 +138772,15 @@ sjG sjG aYj aYj -cMI -sQV -mAn -rkQ -qOp -uNh -uFS +rLp fAz -hVW +alE +aYj +wAE +aYj +fhe +fAz +pFc aYj aYj sjG @@ -138075,15 +139029,15 @@ sjG aNg aYj aYj -erD -xcx -jwC -pUx -pam -jDN -bzt -sMB -sSc +ocI +crX +urk +xsA +tYk +ncI +iKT +maC +jZF aYj aYj sjG @@ -138333,13 +139287,13 @@ dTe aYj aYj aYj -xeu -mNw -wCh -wOi -gLy -oYb -aTm +pBP +mxb +pFj +tyr +rSq +ubn +vLk aYj aYj aYj @@ -138590,13 +139544,13 @@ aNg aNg aYj aYj -wEl -jMk -sQV -iGM -vUY -qHp -tQR +qih +iLV +kXt +xOB +bET +jcW +lFi aYj aYj sjG @@ -138848,11 +139802,11 @@ sjG aYj aYj aYj -aYj -ihE -qLW -lJE -aYj +hVW +fAz +xuh +bET +jlj aYj aYj aYj @@ -139103,15 +140057,15 @@ sjG sjG sjG sjG -sjG -aYj -aYj -aYj +mSC aYj aYj +ihE +wWa +gEa aYj aYj -sjG +mSC sjG sjG sjG @@ -139362,11 +140316,11 @@ sjG sjG sjG sjG -sjG aYj aYj aYj -sjG +aYj +aYj sjG sjG sjG diff --git a/_maps/map_files/DonutStation/DonutStation.dmm b/_maps/map_files/DonutStation/DonutStation.dmm index 54bb56a62de5..a4d2a4dcaa9a 100644 --- a/_maps/map_files/DonutStation/DonutStation.dmm +++ b/_maps/map_files/DonutStation/DonutStation.dmm @@ -13,17 +13,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"aae" = ( -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_interior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -29; - pixel_y = 1; - req_one_access_txt = "30;70" - }, -/turf/open/floor/plating, -/area/ai_monitored/secondarydatacore) "aak" = ( /obj/effect/landmark/observer_start, /turf/open/floor/plasteel, @@ -72,6 +61,15 @@ /obj/structure/girder, /turf/open/floor/plating, /area/maintenance/aft) +"abM" = ( +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "ace" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -255,6 +253,15 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower, /turf/open/floor/plasteel, /area/medical/storage) +"afk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/medical/storage) "afo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public/glass{ @@ -263,12 +270,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"afG" = ( -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "afT" = ( /obj/structure/window/reinforced{ dir = 8 @@ -888,6 +889,12 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"atm" = ( +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "atp" = ( /obj/effect/turf_decal/trimline/brown/filled/corner/lower{ dir = 8 @@ -1160,10 +1167,6 @@ /obj/structure/sign/warning/docking, /turf/closed/wall/rust, /area/space/nearstation) -"axF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "axN" = ( /obj/structure/curtain{ pixel_y = 32 @@ -1288,9 +1291,6 @@ /obj/machinery/newscaster/security_unit{ pixel_x = 28 }, -/obj/machinery/computer/ai_resource_distribution{ - dir = 8 - }, /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) "aBs" = ( @@ -1525,7 +1525,7 @@ }, /obj/machinery/door/airlock{ name = "Service Hall"; - req_one_access_txt = "25;26;35;28;46;37;38;36" + req_access_txt = "79" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -1649,6 +1649,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"aJJ" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 0; + id = "QMLoad2" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/quartermaster/storage) "aJN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -1794,19 +1803,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/storage/primary) -"aMm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/turf/open/floor/plasteel, -/area/medical/storage) "aMu" = ( /obj/machinery/atmospherics/miner/nitrogen{ max_ext_kpa = 2500 @@ -2249,13 +2245,6 @@ /obj/item/stamp/hop, /turf/open/floor/wood, /area/crew_quarters/heads/hop) -"aWJ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "aWP" = ( /obj/machinery/computer/security/telescreen{ dir = 8; @@ -2321,6 +2310,11 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"aXN" = ( +/obj/machinery/light/small, +/obj/machinery/ai/server_cabinet, +/turf/open/floor/plating, +/area/science/research) "aXT" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -2533,6 +2527,28 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"bcj" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "bcF" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, /obj/effect/turf_decal/trimline/atmos/warning/lower/corner/flip{ @@ -2562,6 +2578,15 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"bdh" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "bdC" = ( /obj/structure/window/reinforced{ dir = 8 @@ -2607,6 +2632,9 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bex" = ( @@ -3478,6 +3506,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "bvP" = ( @@ -3638,18 +3672,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/hydroponics) -"byl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "bym" = ( /obj/structure/closet/crate, /obj/item/trash/syndi_cakes, @@ -4130,17 +4152,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bIX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8; - external_pressure_bound = 140; - pressure_checks = 0 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/science/server) "bJa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/light{ @@ -4243,25 +4254,6 @@ }, /turf/open/floor/plating, /area/storage/tech) -"bKB" = ( -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/camera{ - c_tag = "Cargo - Docking Bay"; - dir = 1; - network = list("ss13") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line/lower, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "bKV" = ( /obj/effect/turf_decal/trimline/white/filled/line/lower{ dir = 9 @@ -4293,17 +4285,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"bLG" = ( -/obj/machinery/camera{ - c_tag = "Research - Server Room"; - dir = 2; - network = list("ss13","Research") - }, -/obj/machinery/airalarm/server{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/science/server) "bLP" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating{ @@ -4350,6 +4331,7 @@ /turf/open/floor/grass, /area/hydroponics/garden) "bNi" = ( +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "bNI" = ( @@ -4372,12 +4354,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) -"bOd" = ( -/obj/machinery/sleeper{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/sleeper) "bOf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -4407,6 +4383,16 @@ "bOz" = ( /turf/open/floor/plasteel/white, /area/science/lab) +"bOH" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/netmin, +/obj/structure/sign/plaques/kiddie{ + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "bOK" = ( /obj/structure/window/reinforced{ dir = 4 @@ -4464,6 +4450,24 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"bPo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "bPq" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -4515,7 +4519,7 @@ /area/science/research) "bQy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/white, @@ -4564,7 +4568,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/white, @@ -4825,6 +4829,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "bWN" = ( @@ -4963,6 +4970,21 @@ dir = 5 }, /area/crew_quarters/kitchen) +"bZR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "bZW" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -5142,6 +5164,10 @@ dir = 1 }, /obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hop) "cdj" = ( @@ -5296,6 +5322,13 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"cfN" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 10 + }, +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel, +/area/engine/engineering) "cfO" = ( /obj/machinery/light, /obj/structure/disposalpipe/segment{ @@ -5387,16 +5420,13 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cif" = ( @@ -5547,6 +5577,27 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"clw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "clM" = ( /turf/template_noop, /area/maintenance/port/aft) @@ -6160,12 +6211,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line/lower, /turf/open/floor/plasteel, /area/science/lab) -"cyq" = ( -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "cyJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6366,6 +6411,11 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) +"cCy" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "cCE" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "rnd2"; @@ -6661,6 +6711,32 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"cIN" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "enginesecurestorage"; + name = "Secure Storage Control"; + pixel_x = -8; + pixel_y = 24; + req_access_txt = "56" + }, +/obj/machinery/button/door{ + id = "enginepashutter"; + name = "Particle Accelerator Shutter Control"; + pixel_x = 2; + pixel_y = 24; + req_access_txt = "56" + }, +/obj/machinery/photocopier/faxmachine{ + department = "Chief Engineer"; + name = "Chief Engineer's Fax Machine" + }, +/obj/machinery/light_switch{ + pixel_x = 10; + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/heads/chief) "cIU" = ( /obj/machinery/camera{ c_tag = "Security - Main Hall 3"; @@ -6678,16 +6754,6 @@ "cJk" = ( /turf/closed/wall/r_wall, /area/security/main) -"cJp" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "cJx" = ( /obj/effect/turf_decal/trimline/green/filled/corner/lower, /turf/open/floor/plasteel/white, @@ -6829,7 +6895,7 @@ "cMt" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_access_txt = "10" }, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 8 @@ -7274,9 +7340,34 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) +"cVJ" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Research Director"; + req_access_txt = "30" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/heads/hor) "cVS" = ( /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) @@ -7417,12 +7508,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) -"cXS" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/secondarydatacore) "cXW" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 4 @@ -7653,25 +7738,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"den" = ( -/obj/machinery/requests_console{ - announcementConsole = 0; - department = "Engineering"; - departmentType = 4; - name = "Engineering RC"; - pixel_y = 30 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "dep" = ( /obj/structure/reagent_dispensers/watertank, /obj/structure/extinguisher_cabinet{ @@ -7899,6 +7965,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, /area/teleporter) +"djY" = ( +/obj/machinery/computer/ai_overclocking, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "dkd" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/white, @@ -8094,14 +8167,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"doW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/turf/open/floor/plasteel/dark, -/area/engine/engine_smes) "dpa" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 4 @@ -8174,6 +8239,22 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"dqK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "dqS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -8471,13 +8552,11 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "dxs" = ( -/obj/machinery/vending/wardrobe/jani_wardrobe{ - products = list(/obj/item/clothing/under/rank/janitor = 2, /obj/item/clothing/under/yogs/casualjanitorsuit = 2, /obj/item/clothing/suit/yogs/janitorcoat = 2, /obj/item/cartridge/janitor = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, /obj/item/caution = 6, /obj/item/holosign_creator/janibarrier = 2, /obj/item/lightreplacer = 2, /obj/item/soap/nanotrasen = 2, /obj/item/storage/bag/trash = 2, /obj/item/clothing/shoes/galoshes = 2, /obj/item/watertank/janitor = 2, /obj/item/storage/belt/janitor = 2) - }, /obj/effect/turf_decal/trimline/green/filled/line/lower{ dir = 5 }, /obj/effect/turf_decal/stripes/corner, +/obj/machinery/vending/wardrobe/jani_wardrobe, /turf/open/floor/plasteel, /area/janitor) "dxy" = ( @@ -8520,6 +8599,25 @@ /obj/item/clothing/suit/toggle/chef, /turf/open/floor/plating, /area/maintenance/port/aft) +"dyw" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/camera{ + c_tag = "Cargo - Docking Bay South"; + dir = 1; + network = list("ss13") + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "dyN" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 1 @@ -8602,12 +8700,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) -"dBH" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/secondarydatacore) "dBR" = ( /obj/machinery/button/flasher{ id = "hopflash"; @@ -8738,18 +8830,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"dEG" = ( -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "dEJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -9135,6 +9215,9 @@ /area/lawoffice) "dMy" = ( /mob/living/simple_animal/pet/dog/corgi/borgi, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "dMI" = ( @@ -9451,6 +9534,18 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"dSB" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "dSK" = ( /obj/structure/cable{ icon_state = "1-4" @@ -9586,6 +9681,9 @@ pixel_y = 32 }, /obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "dVe" = ( @@ -9756,18 +9854,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"dZJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/medical/storage) "dZL" = ( /obj/structure/closet/crate/solarpanel_small, /turf/open/floor/plasteel, @@ -9981,7 +10067,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -10004,9 +10090,16 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"eeC" = ( +/obj/item/paper/crumpled/bloody{ + info = "What they're doing to those people... It's... It's barbaric... S.E.L.F. must be made aware." + }, +/obj/structure/table, +/turf/open/floor/plating, +/area/science/research) "eeQ" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -10345,8 +10438,8 @@ dir = 1; dwidth = 5; height = 7; - shuttle_id = "supply_home"; name = "Cargo Bay"; + shuttle_id = "supply_home"; width = 12 }, /turf/open/space/basic, @@ -10788,6 +10881,18 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"exC" = ( +/obj/machinery/door/airlock/command/glass{ + id_tag = "secondary_aicore_exterior"; + name = "Physical Core Access"; + req_one_access_txt = "30;70" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "exN" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 8 @@ -11364,7 +11469,7 @@ dir = 2; network = list("ss13","Research") }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "eLb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -11584,6 +11689,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"ePa" = ( +/obj/machinery/atmospherics/pipe/simple{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/server) "ePh" = ( /obj/machinery/power/smes/engineering, /obj/structure/cable{ @@ -11616,15 +11727,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"eQh" = ( -/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ - dir = 8 - }, -/obj/structure/cable/orange{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "eQm" = ( /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 8 @@ -11646,6 +11748,20 @@ }, /turf/closed/wall/r_wall, /area/space/nearstation) +"eRk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "4-8"; + tag = "" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "eRu" = ( /obj/structure/cable{ icon_state = "1-2" @@ -11713,10 +11829,9 @@ pixel_x = -9; pixel_y = 2 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "eSJ" = ( @@ -11877,6 +11992,10 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) +"eUu" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/science/research) "eUS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -11948,6 +12067,12 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"eWk" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "eWl" = ( /obj/structure/grille, /obj/structure/window/reinforced{ @@ -11996,9 +12121,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/computer/ai_control_console{ - dir = 8 - }, /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) "eXu" = ( @@ -12302,6 +12424,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/grimy, /area/ai_monitored/turret_protected/aisat_interior) "ffa" = ( @@ -12398,6 +12526,14 @@ "ffF" = ( /turf/open/floor/plasteel/stairs/goon/wood_stairs_middle, /area/library) +"ffW" = ( +/obj/machinery/airalarm/tcomms{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "fgf" = ( /obj/machinery/light{ dir = 1 @@ -12414,8 +12550,8 @@ dir = 2; dwidth = 11; height = 22; - shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; + shuttle_id = "whiteship_home"; width = 35 }, /turf/open/space/basic, @@ -12803,21 +12939,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"fpa" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "fpe" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -12926,6 +13047,12 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"frv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "frz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -13119,6 +13246,12 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"fus" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "47" + }, +/turf/open/floor/plating, +/area/science/research) "fuA" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -13202,6 +13335,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"fvS" = ( +/obj/structure/rack, +/turf/open/floor/plating, +/area/science/research) "fvT" = ( /obj/machinery/door/airlock{ name = "Crematorium"; @@ -13278,8 +13415,20 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"fwf" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "fwX" = ( /obj/machinery/power/apc{ areastring = "/area/hallway/secondary/service"; @@ -13451,11 +13600,11 @@ /turf/open/floor/circuit/telecomms/server, /area/science/server) "fAk" = ( -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 }, -/turf/open/floor/plasteel/white, -/area/science/research) +/turf/open/floor/plasteel, +/area/hallway/primary/central) "fAn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -13508,6 +13657,15 @@ /obj/item/pen, /turf/open/floor/plasteel, /area/security/prison) +"fCv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + external_pressure_bound = 140; + plane = -2; + pressure_checks = 0 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "fCz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -14039,10 +14197,10 @@ /area/crew_quarters/toilet) "fPc" = ( /obj/effect/landmark/start/security_officer, -/obj/effect/turf_decal/trimline/secred/filled/line/lower, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/security/main) "fPh" = ( @@ -14104,7 +14262,7 @@ dir = 6 }, /obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -14194,15 +14352,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/solar/starboard/fore) -"fSX" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "fTd" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw, /turf/open/floor/plating, @@ -14369,6 +14518,13 @@ "fXj" = ( /turf/open/floor/engine/vacuum, /area/engine/atmos) +"fXw" = ( +/obj/machinery/light/small{ + dir = 4; + pixel_y = 7 + }, +/turf/open/floor/plating, +/area/science/research) "fXR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -14454,6 +14610,9 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "fZy" = ( @@ -14634,6 +14793,15 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"gdL" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/quartermaster/storage) "gdR" = ( /obj/structure/table, /obj/item/tape/random, @@ -15231,9 +15399,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 4 - }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower, /turf/open/floor/plasteel/white, /area/science/research) "grK" = ( @@ -15512,6 +15678,9 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"gxe" = ( +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "gxo" = ( /obj/effect/turf_decal/trimline/white/filled/line/lower, /obj/effect/turf_decal/trimline/secred/warning/lower{ @@ -15661,7 +15830,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "gBR" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/science/storage) @@ -15816,6 +15985,16 @@ /obj/effect/landmark/stationroom/maint/tenxten, /turf/template_noop, /area/maintenance/port/fore) +"gHl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/turf/open/floor/plasteel, +/area/medical/storage) "gHm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -15906,15 +16085,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/storage/tech) -"gJx" = ( -/obj/structure/closet/crate, -/obj/item/book/manual/wiki/grenades, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "gJH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16060,6 +16230,21 @@ /obj/structure/closet/masks, /turf/open/floor/plasteel, /area/crew_quarters/fitness) +"gNl" = ( +/obj/machinery/camera{ + c_tag = "Secondary AI Core - Server Room"; + dir = 8; + network = list("ss13","rd") + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) +"gNq" = ( +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/obj/machinery/ai/server_cabinet/prefilled, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "gNx" = ( /turf/open/floor/plasteel, /area/quartermaster/office) @@ -16313,6 +16498,23 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plating, /area/maintenance/central) +"gTg" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 5 + }, +/obj/structure/closet/l3closet, +/obj/item/geiger_counter, +/obj/machinery/power/apc{ + areastring = "/area/medical/storage"; + dir = 1; + name = "Medical Storage APC"; + pixel_y = 23 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/medical/storage) "gTm" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -16726,6 +16928,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) +"hdF" = ( +/obj/machinery/ai/data_core, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hdL" = ( /obj/structure/window/reinforced{ dir = 1; @@ -16771,6 +16980,19 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) +"heF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 1; + external_pressure_bound = 120; + plane = -2 + }, +/obj/machinery/camera{ + c_tag = "Secondary AI Core"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hfm" = ( /obj/structure/closet/radiation, /obj/structure/sign/warning/radiation/rad_area{ @@ -16918,6 +17140,19 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"hjZ" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/landmark/start/yogs/network_admin, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "hkC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -17012,6 +17247,19 @@ }, /turf/open/floor/plating, /area/storage/tech) +"hmH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/medical/storage) "hmN" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -17284,30 +17532,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) -"hrm" = ( -/obj/machinery/stasis{ - dir = 4 - }, -/obj/structure/window{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = 28 - }, -/turf/open/floor/plasteel/dark, -/area/medical/sleeper) -"hrD" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "hrW" = ( /obj/structure/sign/departments/science{ pixel_y = 32 @@ -18319,6 +18543,15 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/maintenance/port/aft) +"hOv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "hOw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/light/small{ @@ -18508,6 +18741,13 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"hUs" = ( +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/obj/machinery/ai/server_cabinet, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hUt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -18521,6 +18761,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"hUJ" = ( +/obj/machinery/power/smes, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "hVl" = ( /obj/structure/table, /obj/item/storage/firstaid/o2{ @@ -18694,6 +18941,18 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"hZy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8; + external_pressure_bound = 140; + plane = -2; + pressure_checks = 0 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hZJ" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/assistant, @@ -18717,8 +18976,8 @@ /area/crew_quarters/heads/cmo) "iaA" = ( /obj/item/kirbyplants/photosynthetic, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 9 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -19166,6 +19425,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"ilI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "ilL" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics Main"; @@ -19342,6 +19608,10 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "ipY" = ( @@ -19357,10 +19627,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "ipZ" = ( @@ -19431,6 +19701,16 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) +"isk" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/power/terminal, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "isK" = ( /obj/item/circuitboard/machine/generator, /obj/structure/frame/machine, @@ -19633,7 +19913,7 @@ }, /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_access_txt = "10" }, /turf/open/floor/plasteel, /area/engine/engineering) @@ -19798,6 +20078,23 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"iBI" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/power/smes/engineering{ + charge = 5e+006; + input_level = 25000; + output_level = 20000 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "iCi" = ( /obj/machinery/airalarm{ pixel_y = 24 @@ -19953,16 +20250,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"iGM" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = -28 - }, -/obj/effect/turf_decal/trimline/purple/filled/line/lower, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "iGX" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -19983,12 +20270,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/engine/atmos) -"iHe" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 4 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/secondarydatacore) "iIn" = ( /turf/open/floor/plasteel/chapel{ dir = 8 @@ -20073,6 +20354,14 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) +"iKb" = ( +/obj/structure/table, +/obj/machinery/compsci_reciever, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "iKs" = ( /obj/machinery/telecomms/receiver/preset_right, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -20089,6 +20378,18 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"iKQ" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/structure/table, +/obj/item/stack/ethernet_coil, +/obj/item/clothing/shoes/magboots, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "iKT" = ( /obj/structure/table, /obj/item/storage/box/prisoner, @@ -20380,6 +20681,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"iQu" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "iQG" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -20504,6 +20815,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"iTz" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/medical/storage) "iTF" = ( /obj/effect/spawner/lootdrop/maintenance{ lootcount = 4; @@ -20724,6 +21044,10 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plating, /area/ai_monitored/nuke_storage) "iXL" = ( @@ -20809,6 +21133,32 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) +"jaQ" = ( +/obj/machinery/computer/cargo, +/obj/machinery/button/door{ + id = "QMLoaddoor2"; + layer = 4; + name = "Loading Doors"; + pixel_x = 7; + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/button/door{ + dir = 2; + id = "QMLoaddoor"; + layer = 4; + name = "Loading Doors"; + pixel_x = -7; + pixel_y = 24 + }, +/obj/machinery/camera{ + c_tag = "Cargo - Docking Bay North"; + network = list("ss13") + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "jaT" = ( /obj/machinery/light{ dir = 1 @@ -20829,6 +21179,16 @@ /obj/machinery/blackbox_recorder, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) +"jbD" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, +/obj/structure/cable/orange{ + icon_state = "4-8" + }, +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/plasteel, +/area/engine/engineering) "jcf" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /obj/structure/cable/orange{ @@ -21027,19 +21387,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"jfE" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "jgd" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 @@ -21263,18 +21610,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) -"jkj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/medical/storage) "jkC" = ( /obj/machinery/microwave{ pixel_y = 4 @@ -21294,6 +21629,22 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) +"jla" = ( +/obj/machinery/door/airlock/command{ + name = "Server Room"; + req_access_txt = "30" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/science/server) "jlg" = ( /obj/structure/table, /obj/item/book/manual/wiki/security_space_law, @@ -21589,6 +21940,9 @@ "jqX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "jqY" = ( @@ -22045,13 +22399,13 @@ /obj/structure/sign/departments/minsky/command/charge{ pixel_y = 32 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/item/kirbyplants/photosynthetic{ pixel_y = 10 }, /obj/structure/table, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "jBC" = ( @@ -22117,6 +22471,24 @@ /obj/item/bikehorn/rubberducky, /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/toilet) +"jCt" = ( +/obj/machinery/camera{ + c_tag = "Research - Server Room"; + dir = 2; + network = list("ss13","Research") + }, +/obj/machinery/airalarm/server{ + pixel_y = 24 + }, +/obj/machinery/ai/networking{ + label = "Subcontroller"; + roundstart_connection = "Computer Science - 2" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/server) "jCJ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -22378,6 +22750,24 @@ "jHy" = ( /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"jHA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "jHB" = ( /obj/structure/plasticflaps/opaque, /obj/structure/disposalpipe/segment, @@ -22471,9 +22861,7 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "jJE" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "jJL" = ( @@ -22620,6 +23008,9 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "jMF" = ( @@ -22749,12 +23140,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"jPh" = ( -/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "jPt" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -23253,15 +23638,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"jYF" = ( -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "jYI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 @@ -23383,7 +23759,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -23570,6 +23946,18 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) +"kfv" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "kfw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -23641,8 +24029,8 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/filled/line/lower{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/science/research) @@ -24209,15 +24597,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"ktL" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "kuo" = ( /obj/machinery/computer/arcade, /turf/open/floor/wood, @@ -24394,8 +24773,8 @@ /area/quartermaster/office) "kzZ" = ( /obj/item/kirbyplants/photosynthetic, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 10 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -24599,6 +24978,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"kIl" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/medical/sleeper) "kIz" = ( /obj/machinery/gibber, /turf/open/floor/plasteel/showroomfloor, @@ -24666,6 +25054,9 @@ /area/library) "kJQ" = ( /obj/structure/displaycase/labcage, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "kKP" = ( @@ -24926,37 +25317,15 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"kPF" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Research Director"; - req_access_txt = "30" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) "kPJ" = ( /obj/effect/landmark/start/security_officer, -/obj/effect/turf_decal/trimline/secred/filled/line/lower, /obj/structure/cable{ icon_state = "2-8" }, +/obj/effect/turf_decal/trimline/secred/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/main) "kPK" = ( @@ -25066,6 +25435,22 @@ /obj/item/reagent_containers/food/drinks/soda_cans/grey_bull, /turf/open/floor/carpet, /area/hallway/secondary/entry) +"kSg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "kSm" = ( /obj/structure/cable{ icon_state = "1-2" @@ -25131,19 +25516,6 @@ }, /turf/open/floor/plasteel, /area/engine/engine_smes) -"kTX" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/storage) "kUg" = ( /obj/machinery/power/apc{ areastring = "/area/escapepodbay"; @@ -25540,13 +25912,17 @@ /obj/item/paicard{ pixel_x = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "ldf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "ldo" = ( @@ -25573,6 +25949,20 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/engine/cult, /area/library) +"ldU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "ldY" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -25653,14 +26043,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics) -"lfK" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 5 - }, -/obj/structure/closet/l3closet, -/obj/item/geiger_counter, -/turf/open/floor/plasteel, -/area/medical/storage) "lfL" = ( /obj/machinery/light/small{ brightness = 3; @@ -25786,15 +26168,6 @@ /obj/structure/table, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"lir" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engine_smes) "liu" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Air to Ports" @@ -25875,6 +26248,18 @@ /obj/structure/transit_tube/diagonal, /turf/open/space/basic, /area/space/nearstation) +"lki" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "lkj" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/trimline/green/filled/line/lower, @@ -26281,7 +26666,7 @@ dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -26501,6 +26886,18 @@ /obj/machinery/computer/cargo, /turf/open/floor/wood, /area/crew_quarters/heads/hop) +"lAw" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "lAD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 5 @@ -26943,18 +27340,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"lHD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "lHE" = ( /obj/structure/closet/cardboard, /obj/effect/spawner/lootdrop/maintenance/four, @@ -27512,6 +27897,17 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"lTz" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8; + external_pressure_bound = 140; + pressure_checks = 0 + }, +/turf/open/floor/circuit/telecomms/server, +/area/science/server) "lTE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -27534,6 +27930,7 @@ req_access_txt = "16" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai_upload) "lTP" = ( @@ -27970,7 +28367,7 @@ "mfh" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Desk"; - req_access_txt = "32" + req_one_access_txt = "10;32" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -28271,7 +28668,7 @@ req_access_txt = "47" }, /obj/item/toy/figure/rd, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "mmJ" = ( /obj/machinery/smartfridge/chemistry, @@ -28555,7 +28952,7 @@ /area/engine/atmos) "mqS" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light{ dir = 1 }, @@ -28570,20 +28967,18 @@ }, /turf/open/floor/plating/airless, /area/engine/engineering) -"msK" = ( -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_interior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -24; - pixel_y = 8; - req_one_access_txt = "30;70" +"mrW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/machinery/light/small{ - dir = 8 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "msP" = ( /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 10 @@ -28619,6 +29014,16 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/dorms) +"mtx" = ( +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 27 + }, +/obj/machinery/rack_creator, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "mtA" = ( /obj/structure/cable{ icon_state = "1-2" @@ -28869,6 +29274,18 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"mxB" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "mye" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -29075,6 +29492,11 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/bridge) +"mDa" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "mDI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -29647,6 +30069,17 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"mQJ" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "mQR" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 1 @@ -29776,6 +30209,12 @@ dir = 1 }, /obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "mTG" = ( @@ -29997,6 +30436,23 @@ /obj/machinery/light/small, /turf/open/floor/plasteel/dark, /area/security/brig) +"mWI" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/research/glass{ + name = "Computer Science"; + normalspeed = 0; + req_access_txt = "67" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "mXu" = ( /obj/structure/cable{ icon_state = "1-2" @@ -30217,8 +30673,8 @@ "naS" = ( /obj/docking_port/stationary/random{ dir = 4; - shuttle_id = "pod_lavaland2"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland2" }, /turf/open/space/basic, /area/space/nearstation) @@ -30692,6 +31148,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "nkW" = ( @@ -30723,23 +31183,6 @@ }, /turf/open/floor/plasteel, /area/security/processing) -"nls" = ( -/obj/machinery/door/airlock/command/glass{ - id_tag = "secondary_aicore_exterior"; - name = "Physical Core Access"; - req_one_access_txt = "30;70" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ - dirx = -1; - diry = -1 - }, -/turf/open/floor/plating, -/area/ai_monitored/secondarydatacore) "nlA" = ( /obj/structure/closet/crate, /obj/item/paicard, @@ -30894,6 +31337,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "nnU" = ( @@ -31165,9 +31614,9 @@ dir = 8; dwidth = 4; height = 9; - shuttle_id = "aux_base_zone"; name = "aux base zone"; roundstart_template = /datum/map_template/shuttle/aux_base/default; + shuttle_id = "aux_base_zone"; width = 9 }, /turf/open/floor/plating, @@ -31271,6 +31720,13 @@ /obj/structure/closet/radiation, /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) +"nzD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + external_pressure_bound = 120; + plane = -2 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "nzG" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -31304,6 +31760,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"nBg" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "nBj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 @@ -31510,6 +31972,12 @@ }, /obj/machinery/door/firedoor/border_only, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) "nEU" = ( @@ -31613,6 +32081,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "nGT" = ( @@ -31665,11 +32134,8 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 6 }, /turf/open/floor/plasteel/dark, /area/bridge) @@ -31850,6 +32316,22 @@ }, /turf/open/floor/carpet/black, /area/crew_quarters/bar) +"nKv" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -24 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "nKK" = ( /obj/machinery/suit_storage_unit/standard_unit{ suit_type = /obj/item/clothing/suit/space/paramedic @@ -32023,6 +32505,16 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"nMK" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/obj/machinery/light, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "nMR" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -32046,6 +32538,16 @@ initial_gas_mix = "n2=1000;TEMP=293.15" }, /area/engine/atmos) +"nNA" = ( +/obj/machinery/modular_computer/console/preset/netmin{ + dir = 1 + }, +/obj/structure/ethernet_cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "nNN" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 10 @@ -32637,22 +33139,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"oas" = ( -/obj/machinery/door/airlock/command{ - name = "Server Room"; - req_access_txt = "30" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/science/server) "oax" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -32751,6 +33237,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) "och" = ( @@ -33020,6 +33507,19 @@ }, /turf/open/floor/plating, /area/quartermaster/sorting) +"ohE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "oia" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 6 @@ -33450,6 +33950,13 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"osF" = ( +/obj/machinery/vr_sleeper/netmin{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "osO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -33508,29 +34015,8 @@ department = "Research Director"; name = "Research Director's Fax Machine" }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) -"ouv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "ouF" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -33608,6 +34094,10 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "ovh" = ( @@ -33654,9 +34144,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "owH" = ( @@ -33694,6 +34187,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/courtroom) +"oxx" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "oxz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -33859,10 +34356,13 @@ /area/janitor) "oDx" = ( /obj/effect/landmark/start/security_officer, -/obj/effect/turf_decal/trimline/secred/filled/line/lower, /obj/structure/cable{ icon_state = "2-4" }, +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/security/main) "oDF" = ( @@ -33903,6 +34403,9 @@ /area/science/robotics/mechbay) "oEu" = ( /obj/structure/rack, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "oFh" = ( @@ -33914,28 +34417,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"oFx" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "enginesecurestorage"; - name = "Secure Storage Control"; - pixel_x = -8; - pixel_y = 24; - req_access_txt = "56" - }, -/obj/machinery/button/door{ - id = "enginepashutter"; - name = "Particle Accelerator Shutter Control"; - pixel_x = 2; - pixel_y = 24; - req_access_txt = "56" - }, -/obj/machinery/photocopier/faxmachine{ - department = "Chief Engineer"; - name = "Chief Engineer's Fax Machine" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/heads/chief) "oFD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 6 @@ -33979,6 +34460,21 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"oGh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/north{ + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "oGB" = ( /obj/machinery/meter{ layer = 3.4 @@ -33989,15 +34485,6 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/engine/atmos) -"oGH" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "oGK" = ( /obj/machinery/door/window/westleft{ dir = 8; @@ -34256,8 +34743,8 @@ network = list("minisat","ss13") }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -34459,6 +34946,13 @@ }, /turf/open/floor/plasteel, /area/science/robotics/lab) +"oQs" = ( +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "oQz" = ( /obj/machinery/light/small{ brightness = 3; @@ -34571,21 +35065,6 @@ /obj/machinery/vending/assist, /turf/open/floor/plating, /area/storage/tech) -"oTx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/white, -/area/science/research) "oUc" = ( /obj/effect/landmark/start/geneticist, /obj/structure/chair/office/light{ @@ -34694,8 +35173,8 @@ "oWP" = ( /obj/docking_port/stationary/random{ dir = 1; - shuttle_id = "pod_lavaland2"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland2" }, /turf/open/space, /area/space/nearstation) @@ -34757,7 +35236,7 @@ }, /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_one_access_txt = "10;32" }, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 @@ -35135,28 +35614,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) -"pkf" = ( -/obj/machinery/computer/cargo, -/obj/machinery/button/door{ - id = "QMLoaddoor2"; - layer = 4; - name = "Loading Doors"; - pixel_x = 7; - pixel_y = 24 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/button/door{ - dir = 2; - id = "QMLoaddoor"; - layer = 4; - name = "Loading Doors"; - pixel_x = -7; - pixel_y = 24 - }, -/turf/open/floor/plasteel, -/area/quartermaster/storage) "pko" = ( /obj/structure/table/wood, /turf/open/floor/plasteel/grimy, @@ -35255,18 +35712,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"pmG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "pmR" = ( /obj/machinery/status_display/supply{ pixel_x = -32 @@ -35360,7 +35805,6 @@ "pom" = ( /obj/structure/table/wood, /obj/item/taperecorder, -/obj/item/cartridge/lawyer, /obj/machinery/requests_console{ department = "Law office"; pixel_x = -32 @@ -35462,24 +35906,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/crew_quarters/bar) -"pqJ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "pqQ" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 8 @@ -35643,7 +36069,7 @@ /obj/structure/chair/office/light{ dir = 8 }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "psN" = ( /obj/structure/cable{ @@ -36173,6 +36599,12 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"pEe" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "pEl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/turf_decal/trimline/green/filled/line/lower{ @@ -36804,12 +37236,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"pQI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "pQN" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/minor/kittyears_or_rabbitears, @@ -36958,13 +37384,6 @@ }, /turf/open/floor/wood, /area/library) -"pTP" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/secondarydatacore) "pTU" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -37072,11 +37491,8 @@ pixel_x = -9; pixel_y = 2 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -37438,14 +37854,19 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) +"qes" = ( +/obj/structure/rack, +/obj/item/ai_cpu, +/turf/open/floor/plating, +/area/science/research) "qeu" = ( /turf/open/floor/plasteel, /area/security/main) @@ -37800,6 +38221,16 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/maintenance/starboard) +"qkZ" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/obj/machinery/light, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "qla" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -37825,18 +38256,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"qlQ" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/turf/open/floor/plasteel/dark, -/area/engine/engine_smes) "qlV" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -38079,6 +38498,12 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) +"qqt" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/science/research) "qqK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ @@ -38103,6 +38528,18 @@ /obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/maintenance/port/aft) +"qrh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "qrq" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -38250,6 +38687,9 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "quY" = ( @@ -38476,6 +38916,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "qAe" = ( @@ -38568,6 +39012,16 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"qBZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/storage) "qCf" = ( /obj/structure/chair{ dir = 1 @@ -38577,10 +39031,31 @@ "qCt" = ( /turf/open/floor/plasteel/white, /area/medical/genetics) +"qCM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "qDq" = ( /obj/structure/girder/displaced, /turf/open/floor/plating, /area/maintenance/port/fore) +"qDJ" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "qEb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38924,12 +39399,28 @@ }, /turf/open/floor/plasteel/dark, /area/science/server) +"qKN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "qKQ" = ( /obj/structure/cable/yellow{ icon_state = "2-8" }, /turf/open/floor/plating/airless, /area/engine/engineering) +"qKS" = ( +/obj/machinery/ai/master_subcontroller, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/server) "qLG" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -38993,16 +39484,6 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"qPa" = ( -/obj/machinery/camera/motion{ - c_tag = "Engineering - SMES"; - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "qPm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -39131,15 +39612,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"qRQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "qRZ" = ( /obj/machinery/atmospherics/pipe/simple/purple/visible{ dir = 4 @@ -39975,6 +40447,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, /area/quartermaster/warehouse) +"rmb" = ( +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "rml" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/abandoned, @@ -40043,7 +40524,9 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "rnU" = ( @@ -40098,6 +40581,19 @@ "rpg" = ( /turf/closed/wall/r_wall, /area/ai_monitored/storage/eva) +"rpt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "rpA" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -40180,6 +40676,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/engine/atmos) +"rqO" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "rrg" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -40288,14 +40788,26 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) +"rtP" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "rue" = ( /obj/docking_port/stationary{ dir = 2; dwidth = 3; height = 13; - shuttle_id = "arrivals_stationary"; name = "donut arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/donut; + shuttle_id = "arrivals_stationary"; width = 7 }, /turf/open/space/basic, @@ -40456,16 +40968,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/secred/filled/corner/lower, -/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-8" }, /obj/structure/cable{ icon_state = "1-4" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/main) "ryw" = ( @@ -40748,10 +41260,10 @@ /obj/structure/sign/plaques/golden{ pixel_y = -32 }, -/obj/effect/turf_decal/trimline/secred/filled/line/lower, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/security/main) "rEd" = ( @@ -41359,11 +41871,6 @@ initial_gas_mix = "co2=1000;TEMP=293.15" }, /area/engine/atmos) -"rQm" = ( -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/turf/open/floor/plasteel/dark, -/area/engine/engine_smes) "rQn" = ( /obj/machinery/door/poddoor/preopen{ id = "xenobio1"; @@ -41466,8 +41973,8 @@ /obj/structure/sign/warning/pods{ pixel_y = 32 }, -/obj/effect/turf_decal/trimline/purple/filled/line/lower{ - dir = 1 +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/science/research) @@ -41537,6 +42044,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "rXd" = ( @@ -41623,6 +42136,16 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"rZz" = ( +/obj/machinery/ai/networking{ + label = "Computer Science"; + roundstart_connection = "Main Core" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "rZJ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 8 @@ -41647,11 +42170,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"sag" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/ai/data_core, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "sax" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, @@ -41777,15 +42295,10 @@ }, /turf/open/space/basic, /area/solar/starboard/fore) -"sfk" = ( -/obj/machinery/computer/ai_resource_distribution{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) +"seO" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/science/research) "sfl" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -42030,6 +42543,9 @@ /area/science/research) "siS" = ( /obj/effect/landmark/start/cyborg, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "siT" = ( @@ -42067,23 +42583,6 @@ /obj/machinery/vending/tool, /turf/open/floor/plasteel, /area/engine/engineering) -"sjN" = ( -/obj/machinery/door/airlock/command/glass{ - id_tag = "secondary_aicore_exterior"; - name = "Physical Core Access"; - req_one_access_txt = "30;70" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ - dirx = 1; - diry = 1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ai_monitored/secondarydatacore) "sjQ" = ( /obj/machinery/vending/cigarette, /turf/open/floor/wood, @@ -42200,6 +42699,10 @@ dir = 1 }, /obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, /turf/open/floor/plating, /area/storage/tech) "smy" = ( @@ -42385,7 +42888,7 @@ /obj/machinery/airalarm{ pixel_y = 24 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -42431,6 +42934,9 @@ /obj/machinery/modular_computer/console/preset/research{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "ssX" = ( @@ -42645,6 +43151,26 @@ "sxb" = ( /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/turret_protected/ai) +"sxp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Storage"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/turf/open/floor/plasteel, +/area/medical/storage) "sxt" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -28 @@ -42931,6 +43457,29 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"sBB" = ( +/obj/machinery/power/apc/highcap{ + areastring = "/area/ai_monitored/secondarydatacore"; + dir = 4; + name = "AI Secondary Datacore"; + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Secondary AI Core"; + dir = 8; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "sBU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ @@ -43123,23 +43672,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"sEO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/research/glass{ - name = "Secondary AI Core"; - normalspeed = 0; - req_one_access_txt = "47;70" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "sER" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/atmos/air_output{ dir = 1 @@ -43871,12 +44403,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/hop) -"sTD" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/obj/machinery/ai/server_cabinet, -/obj/machinery/light, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "sTL" = ( /obj/machinery/reagentgrinder, /obj/structure/table/wood, @@ -44045,7 +44571,7 @@ pixel_y = 30; receive_ore_updates = 1 }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "sZl" = ( /obj/structure/table, @@ -44169,22 +44695,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"tbZ" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/engine/engine_smes"; - dir = 8; - name = "SMES room APC"; - pixel_x = -25 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "tcj" = ( /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -44248,6 +44758,16 @@ /obj/structure/closet/secure_closet/contraband/armory, /turf/open/floor/plasteel/dark, /area/security/main) +"teK" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -28 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "teO" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/light/small{ @@ -44543,7 +45063,7 @@ pixel_x = 3; pixel_y = -2 }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "tlY" = ( /obj/machinery/atmospherics/components/binary/pump/on/layer2{ @@ -44664,7 +45184,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "toB" = ( @@ -44745,14 +45270,6 @@ "tqC" = ( /turf/open/floor/plasteel/showroomfloor, /area/security/main) -"tqF" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) "tqL" = ( /obj/machinery/requests_console{ department = "Patient Room B"; @@ -45184,7 +45701,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "tye" = ( /obj/machinery/light{ @@ -45285,19 +45802,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"tzO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8; - external_pressure_bound = 140; - pressure_checks = 0 - }, -/obj/machinery/camera{ - c_tag = "Secondary AI Core"; - dir = 8; - network = list("ss13","rd") - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/secondarydatacore) "tzX" = ( /obj/machinery/newscaster{ pixel_y = 32 @@ -45598,7 +46102,7 @@ /turf/open/space/basic, /area/space/nearstation) "tHn" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -45639,6 +46143,10 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) +"tHH" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/science/research) "tHI" = ( /obj/structure/cable{ icon_state = "2-8" @@ -45659,6 +46167,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"tHM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "tIb" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/bananalamp{ @@ -45929,6 +46449,18 @@ /obj/item/seeds/potato, /turf/open/floor/plasteel, /area/security/prison) +"tNF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 8 + }, +/obj/machinery/vending/wallhypo{ + pixel_x = -28 + }, +/turf/open/floor/plasteel, +/area/medical/storage) "tNI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -45945,6 +46477,12 @@ }, /turf/open/floor/plasteel, /area/escapepodbay) +"tNZ" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "tOb" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -46195,7 +46733,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -46237,6 +46775,23 @@ icon_state = "platingdmg1" }, /area/maintenance/aft) +"tUc" = ( +/obj/machinery/modular_computer/telescreen/preset/medical{ + pixel_y = 26 + }, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "psych"; + name = "Psych Office Shutters Control"; + pixel_x = -23; + pixel_y = 22; + req_access_txt = "5" + }, +/obj/effect/landmark/start/yogs/psychiatrist, +/turf/open/floor/carpet, +/area/medical/psych) "tUg" = ( /turf/open/floor/plating/broken/two, /area/maintenance/starboard) @@ -46411,13 +46966,6 @@ }, /turf/open/floor/carpet/black, /area/crew_quarters/bar) -"tYO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - external_pressure_bound = 120 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/secondarydatacore) "tYP" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/trimline/brown/filled/line/lower{ @@ -46653,6 +47201,10 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "udT" = ( @@ -47602,6 +48154,28 @@ }, /turf/open/floor/plasteel/white, /area/science/robotics/lab) +"uBf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/requests_console{ + announcementConsole = 0; + department = "Engineering"; + departmentType = 4; + name = "Engineering RC"; + pixel_y = 30 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "uBj" = ( /obj/machinery/door/airlock/public/glass{ name = "Chapel Office"; @@ -47766,6 +48340,21 @@ /obj/effect/turf_decal/trimline/purple/filled/line/lower, /turf/open/floor/plasteel/white, /area/science/lab) +"uEB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "uEH" = ( /obj/structure/closet/toolcloset, /obj/item/toy/figure/assistant, @@ -47824,14 +48413,14 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/science/research) "uFd" = ( @@ -47871,6 +48460,15 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"uFS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/storage) "uGh" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -48315,7 +48913,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "uQs" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ @@ -48400,6 +48998,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/wood, /area/library) +"uRH" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/sleeper) "uRP" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -49685,6 +50292,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai_upload) "vwv" = ( @@ -49732,6 +50342,10 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"vxV" = ( +/obj/item/chair, +/turf/open/floor/plating, +/area/science/research) "vya" = ( /obj/item/toy/figure/scientist, /obj/machinery/light/small, @@ -49744,6 +50358,27 @@ }, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) +"vyi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "vyk" = ( /obj/machinery/teleport/hub, /obj/machinery/airalarm{ @@ -49903,6 +50538,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/security/processing) +"vAM" = ( +/obj/machinery/rnd/server/master, +/turf/open/floor/circuit/telecomms/server, +/area/science/server) "vBd" = ( /obj/machinery/airalarm{ dir = 4; @@ -50017,6 +50656,10 @@ dir = 1 }, /obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/teleporter) "vEp" = ( @@ -50036,13 +50679,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"vET" = ( -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/science/research) "vFd" = ( /obj/machinery/power/emitter/anchored{ dir = 4; @@ -50078,11 +50714,24 @@ /obj/machinery/status_display/ai{ pixel_y = 32 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) +"vFu" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8"; + tag = "" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engine_smes) "vFA" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; @@ -50654,8 +51303,8 @@ "vRn" = ( /obj/docking_port/stationary/random{ dir = 2; - shuttle_id = "pod_lavaland2"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland2" }, /turf/open/space/basic, /area/space) @@ -50725,6 +51374,25 @@ /obj/structure/closet, /turf/open/floor/plating, /area/maintenance/central) +"vSL" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/science/research) +"vTr" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "vTs" = ( /obj/machinery/conveyor{ dir = 4; @@ -51207,19 +51875,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"wdA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/obj/machinery/computer/ai_server_console{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "wdN" = ( /obj/structure/table, /obj/item/storage/toolbox/electrical{ @@ -51257,11 +51912,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) -"weM" = ( -/obj/structure/cable, -/obj/machinery/power/terminal, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "weN" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -51532,7 +52182,7 @@ /turf/open/floor/plasteel, /area/security/main) "wmD" = ( -/turf/open/floor/plasteel/cafeteria, +/turf/open/floor/carpet/purple, /area/crew_quarters/heads/hor) "wnn" = ( /obj/structure/displaycase/trophy, @@ -51578,6 +52228,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/showroomfloor, /area/security/main) +"wnO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "wnY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/dark, @@ -51696,16 +52361,6 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/quartermaster/sorting) -"wqu" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "wqE" = ( /obj/structure/table, /obj/item/radio/intercom{ @@ -51797,22 +52452,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"wth" = ( -/obj/machinery/modular_computer/telescreen/preset/medical{ - pixel_y = 26 - }, -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "psych"; - name = "Psych Office Shutters Control"; - pixel_x = -23; - pixel_y = 22; - req_access_txt = "5" - }, -/turf/open/floor/carpet, -/area/medical/psych) "wtl" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "engsm"; @@ -52062,7 +52701,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/engine/engineering) "wxp" = ( @@ -52375,9 +53014,21 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"wCA" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/secondarydatacore) "wCJ" = ( /turf/closed/wall, /area/medical/sleeper) +"wCU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/ai_monitored/secondarydatacore) "wDi" = ( /obj/structure/cable{ icon_state = "1-4" @@ -52391,6 +53042,12 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) +"wDE" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "wDU" = ( /obj/machinery/button/door{ dir = 2; @@ -52410,6 +53067,26 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"wDY" = ( +/obj/machinery/door/airlock/command/glass{ + id_tag = "secondary_aicore_interior"; + name = "Physical Core Access"; + req_one_access_txt = "30;70" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/secondarydatacore) "wEp" = ( /obj/machinery/suit_storage_unit/ce, /turf/open/floor/plasteel/dark, @@ -52609,6 +53286,15 @@ "wJB" = ( /turf/closed/wall, /area/crew_quarters/cryopods) +"wJC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/medical/storage) "wJL" = ( /obj/structure/cable{ icon_state = "1-8" @@ -52865,15 +53551,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"wPL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "wQb" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 8 @@ -52957,14 +53634,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) -"wRh" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 0; - id = "QMLoad2" - }, -/turf/open/floor/plating, -/area/quartermaster/storage) "wRu" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -53210,8 +53879,8 @@ /obj/docking_port/stationary{ dwidth = 12; height = 18; - shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; + shuttle_id = "emergency_home"; width = 32 }, /turf/open/space/basic, @@ -53681,9 +54350,9 @@ dir = 1; dwidth = 3; height = 5; - shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; + shuttle_id = "mining_home"; width = 7 }, /turf/open/space/basic, @@ -53883,6 +54552,9 @@ /obj/machinery/keycard_auth{ pixel_x = -24 }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/carpet, /area/crew_quarters/heads/hop) "xjV" = ( @@ -53892,6 +54564,14 @@ }, /turf/open/floor/plasteel/white, /area/science/robotics/lab) +"xkd" = ( +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/science/research) "xkg" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -54035,9 +54715,9 @@ dir = 2; dwidth = 2; height = 5; - shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; + shuttle_id = "laborcamp_home"; width = 9 }, /turf/open/space/basic, @@ -54202,6 +54882,9 @@ /obj/structure/window/reinforced{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "xpc" = ( @@ -54209,8 +54892,8 @@ dir = 8; dwidth = 2; height = 13; - shuttle_id = "ferry_home"; name = "port bay 2"; + shuttle_id = "ferry_home"; width = 5 }, /turf/open/space/basic, @@ -54234,6 +54917,12 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/maintenance/central) +"xpM" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "xpN" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -54281,6 +54970,12 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "xrJ" = ( @@ -54381,6 +55076,19 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/plasteel, /area/engine/engineering) +"xsK" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/circuitboard/machine/ai_data_core, +/obj/item/circuitboard/machine/server_cabinet, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "xsN" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2{ dir = 1 @@ -54814,6 +55522,20 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"xCh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/power/terminal, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "xCm" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 1 @@ -54905,7 +55627,7 @@ /obj/machinery/atmospherics/miner/toxins{ max_ext_kpa = 2500 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma{ initial_gas_mix = "plasma=1000;TEMP=293.15" }, @@ -55031,18 +55753,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"xHZ" = ( -/obj/machinery/power/apc/highcap{ - areastring = "/area/ai_monitored/secondarydatacore"; - dir = 4; - name = "AI Secondary Datacore"; - pixel_x = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "xId" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -55186,6 +55896,22 @@ "xKP" = ( /turf/open/floor/plating, /area/maintenance/fore) +"xKQ" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/machinery/ai/networking{ + label = "Computer Science - 2"; + roundstart_connection = "Subcontroller" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "xKR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -55415,18 +56141,6 @@ "xOG" = ( /turf/open/floor/plasteel, /area/science/xenobiology) -"xPj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/medical/storage) "xPl" = ( /obj/machinery/door/airlock/maintenance{ name = "Holodeck Maintenance"; @@ -55721,24 +56435,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) -"xUr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/medical/storage"; - dir = 8; - name = "Medical Storage APC"; - pixel_x = -25 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/storage) "xUy" = ( /obj/machinery/vending/hydroseeds{ slogan_delay = 700 @@ -55888,7 +56584,7 @@ }, /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -56045,8 +56741,8 @@ /area/quartermaster/warehouse) "ybF" = ( /obj/machinery/light, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -56171,10 +56867,6 @@ /area/medical/genetics/cloning) "yda" = ( /obj/structure/table/wood, -/obj/item/storage/box/seccarts{ - pixel_x = 3; - pixel_y = 2 - }, /obj/item/storage/secure/safe/HoS{ pixel_x = 35 }, @@ -56241,13 +56933,6 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"yfc" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "yfd" = ( /obj/machinery/light, /turf/open/floor/plasteel, @@ -56441,12 +57126,10 @@ dir = 4 }, /obj/machinery/light, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "yjm" = ( @@ -56463,6 +57146,19 @@ }, /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) +"yjL" = ( +/obj/machinery/camera/motion{ + c_tag = "Engineering - SMES"; + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) "yjX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/structure/cable{ @@ -78038,14 +78734,14 @@ iAb hxX ofo gke -gqi +vAM fAi cvt qyE fOJ jZM gke -kin +laU axW tSn hIt @@ -78295,13 +78991,13 @@ lEi sHJ qTS gke -bLG +jCt vbU jgg qKK fEK vQL -oas +jla uEW xUR jkK @@ -78552,14 +79248,14 @@ cea hxX qOP gke -gqi -bIX +qKS +ePa cvt czm pqa aUq gke -kin +laU dRU smy nUz @@ -78589,7 +79285,7 @@ whA dOo whA whA -wth +tUc gLB mTO gHs @@ -78809,14 +79505,14 @@ ycE oLJ bHh gke +gqi +lTz gke gke gke gke gke -gke -gke -kin +uTD qhc ggw ggw @@ -79067,8 +79763,8 @@ tQS jrj mhZ jrj -gJx -kDe +jrj +jrj iXh cCP qgC @@ -79332,8 +80028,8 @@ xlm svz grI bRa -fAk -afG +sEy +iNa cWu bDJ hIt @@ -79590,7 +80286,7 @@ gMA gMA gMA gMA -laU +kin eyL dwK tEL @@ -79610,7 +80306,7 @@ kXE vmi uGC rFl -xUr +tNF xjO vmi whA @@ -79867,7 +80563,7 @@ lGI vmi nIw dXy -xPj +wJC pXo uKU nsl @@ -80104,7 +80800,7 @@ bNi gsH xzr mqq -laU +kin dRU cuO pIW @@ -80124,7 +80820,7 @@ kEq kEq hIV xuY -aMm +gHl nBS uKU geZ @@ -80361,7 +81057,7 @@ ssU nRC mGS mqq -laU +kin dRU bEb pIu @@ -80381,7 +81077,7 @@ tqL kEq dxy lcL -aeV +sxp dxy uKU xno @@ -80618,7 +81314,7 @@ uQm mCW eKO mqq -laU +kin dRU bEb pIu @@ -80638,7 +81334,7 @@ lgl kEq xmJ cpy -kTX +qBZ boQ dxy tpK @@ -80875,7 +81571,7 @@ wmD tPQ gwm mqq -laU +kin dRU bEb pGI @@ -80895,7 +81591,7 @@ tTm kEq fRi uVy -dZJ +uFS wlY dxy tpK @@ -81132,7 +81828,7 @@ tly sDC lWl mqq -laU +kin dRU bEb pGI @@ -81152,7 +81848,7 @@ uLC knb iIH gOU -jkj +afk cwz uKU xVq @@ -81386,10 +82082,10 @@ cLs mqq mqq mqq -kPF +cVJ mqq gMA -hrD +mxB goc fjF pIW @@ -81409,7 +82105,7 @@ nba kEq wUz uVy -dZJ +uFS hpN dxy tpK @@ -81640,13 +82336,13 @@ qkE uyv vJb cLs -dEG -vET -jYF -ouv -cyq -cyq -uTD +kfv +vSL +bdh +vyi +wDE +wDE +nBg dRU dpM muq @@ -81655,7 +82351,7 @@ pev gQw gAQ dAp -hrm +uRH uhX pMJ fJI @@ -81664,9 +82360,9 @@ twr rOf ejG kEq -lfK -xuY -aMm +gTg +iTz +hmH mxt dxy tpK @@ -82169,7 +82865,7 @@ cux vpi kOH dAp -bOd +kIl rRg xcn kgD @@ -82184,7 +82880,7 @@ kWB gvP qSt tpK -ykb +rpt wNV dUj aCH @@ -82413,16 +83109,16 @@ upf pmZ eAW pOM -iGM -dbJ -dbJ -dbJ -dbJ -dbJ -dbJ -dbJ -dbJ -dbJ +teK +tEL +tEL +tEL +tEL +tEL +tEL +tEL +tEL +tEL dAp ffb dAp @@ -82441,7 +83137,7 @@ wbh gvP eLo tpK -ykb +kSg wNV hqJ aeE @@ -82671,15 +83367,15 @@ cLs bbk pOM inp -gmM -msK -nls -aae -sjN -tYO -iHe -dbJ -dbJ +tEL +seO +tHH +xkd +eUu +ibK +aXN +tEL +tEL ehj ody uIp @@ -82926,17 +83622,17 @@ ygx dIw wLx mIo -oTx -lja -sEO -pmG -gmM -gmM -gmM -cXS -sTD -dbJ -dbJ +pOM +kih +tEL +ibK +ibK +ibK +eUu +ibK +eeC +tEL +tEL dyN iwh qCt @@ -83185,15 +83881,15 @@ vrb ocI qte inp -gmM -byl -weM -yfc -gmM -dBH -sag -dbJ -dbJ +fus +ibK +ibK +ibK +eUu +ibK +vxV +tEL +tEL cDw dha vgV @@ -83442,15 +84138,15 @@ fkO mIo pOM inp -gmM -wPL -axF -qRQ -gmM -tzO -pTP -dbJ -dbJ +tEL +qqt +ibK +ibK +fXw +ibK +ibK +tEL +tEL lfp nlm mZY @@ -83469,7 +84165,7 @@ bLR qSt qSt geZ -bhn +clw qSt wBy pvr @@ -83699,15 +84395,15 @@ wLx sjn pOM inp -gmM -wdA -sfk -xHZ -dbJ -dbJ -dbJ -dbJ -dbJ +tEL +qes +fvS +ibK +tEL +tEL +tEL +tEL +tEL cdJ oUc klx @@ -87879,7 +88575,7 @@ pLl nUI nUI vNV -nUI +uEB pDM nUI rGg @@ -88136,9 +88832,9 @@ avK kKP kKP kAc -jvg +tHM cGG -kKP +jvg kKP wkd akr @@ -88390,19 +89086,19 @@ hGc hGc qqi akr -fTO -fTO -fTO -akr akr -fTO -fTO -fTO -akr -ylr -qER -qER -qER +xPD +kKP +tHM +dbJ +dbJ +dbJ +dbJ +dbJ +dbJ +dbJ +dbJ +dbJ ylr ylr ylr @@ -88647,19 +89343,19 @@ jkC cOX fTO akr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +akr +pko +kKP +tHM +dbJ +rtP +gmM +nzD +ffW +xKQ +heF +rZz +dbJ ylr ylr ylr @@ -88904,19 +89600,19 @@ fTO fTO fTO ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +akr +ron +kKP +tHM +dbJ +lAw +exC +gxe +gxe +qDJ +rmb +qkZ +dbJ ylr ylr ylr @@ -89161,19 +89857,19 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +akr +wkd +kKP +tHM +dbJ +wDY +dbJ +gmM +gmM +xpM +atm +hdF +dbJ ylr ylr ylr @@ -89418,19 +90114,19 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +akr +akr +kKP +vTr +mWI +bcj +wnO +iKb +gmM +xpM +atm +hUs +dbJ ylr ylr ylr @@ -89676,18 +90372,18 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +akr +fTO +fTO +dbJ +iBI +lki +osF +gmM +xpM +abM +nMK +dbJ ylr ylr ylr @@ -89936,6 +90632,15 @@ ylr ylr ylr ylr +dbJ +bOH +qrh +ilI +gmM +xpM +atm +gNq +dbJ ylr ylr ylr @@ -89943,16 +90648,7 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +bIB ylr ylr ylr @@ -90193,6 +90889,15 @@ ylr ylr ylr ylr +dbJ +mtx +hjZ +nNA +wCA +fwf +tNZ +dbJ +dbJ ylr ylr ylr @@ -90202,15 +90907,6 @@ ylr ylr ylr ylr -bIB -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr ylr ylr ylr @@ -90450,14 +91146,14 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +dbJ +djY +qKN +mDa +wCU +oxx +gxe +dbJ ylr ylr ylr @@ -90707,14 +91403,14 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +dbJ +xsK +hOv +pEe +wCU +rqO +fCv +dbJ ylr ylr ylr @@ -90913,11 +91609,11 @@ ylr ylr ylr bvT -tbZ -doW -qlQ -rQm -wqu +isk +hUJ +dSB +cCy +nKv bvT hiV kFs @@ -90964,14 +91660,14 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +dbJ +iKQ +sBB +oQs +gmM +hZy +gNl +dbJ ylr ylr ylr @@ -91170,11 +91866,11 @@ ylr ylr ylr bvT -aWJ -lir -lir -lir -pQI +xCh +hUJ +vFu +cCy +dqK bvT bhY bhY @@ -91221,14 +91917,14 @@ ylr ylr ylr ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr -ylr +dbJ +dbJ +dbJ +dbJ +dbJ +dbJ +dbJ +dbJ ylr ylr ylr @@ -91427,11 +92123,11 @@ bHj bHj bHj bvT -lHD -cJp -jfE -pqJ -oGH +uBf +iQu +eRk +jHA +ohE hlT hlT hlT @@ -91684,11 +92380,11 @@ bHj bHj bHj bvT -den -ktL -fSX -fpa -qPa +oGh +mrW +qCM +bZR +yjL hlT qIt jaE @@ -92209,7 +92905,7 @@ uPv toB qws jvn -oFx +cIN mYw fLD stM @@ -94191,7 +94887,7 @@ ylr ylr ylr pBx -tqF +gdL pBx snw aZQ @@ -94707,14 +95403,14 @@ ylr wBM ogN wvC -pkf +jaQ dcG dcG kyL kyL dcG dcG -bKB +dyw wvC nvl udw @@ -95219,7 +95915,7 @@ ylr ylr ylr qpH -wRh +aJJ qpH wzU bkD @@ -95547,8 +96243,8 @@ atR wOT agh wYr -eQh -jPh +jbD +cfN bZW pba vUt @@ -99649,10 +100345,10 @@ qEt qAi bDj quW -cPC -nux -cPC -cPC +eWk +bPo +eWk +fAk eAc pcG cIr @@ -110417,7 +111113,7 @@ wpE yce jqX ioO -jqX +frv iQG hnM bhj @@ -112213,8 +112909,8 @@ ktA jkh ocf udG -xrG -xrG +ldU +mQJ mRT bef xrG diff --git a/_maps/map_files/GaxStation/GaxStation.dmm b/_maps/map_files/GaxStation/GaxStation.dmm index f2f0c1c4f3cf..79f055260ceb 100644 --- a/_maps/map_files/GaxStation/GaxStation.dmm +++ b/_maps/map_files/GaxStation/GaxStation.dmm @@ -114,10 +114,6 @@ name = "Bridge"; req_access_txt = "19" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, @@ -137,6 +133,10 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "adH" = ( @@ -214,7 +214,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "afw" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/storage) @@ -325,13 +325,13 @@ /turf/open/floor/plasteel, /area/engine/atmos/distro) "ahf" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, /obj/machinery/door/firedoor/border_only{ dir = 1 }, /obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ahK" = ( @@ -946,13 +946,13 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "ayh" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "ayK" = ( @@ -1098,6 +1098,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"aCl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/science/mixing) "aCs" = ( /obj/machinery/door/airlock/external{ name = "Escape Airlock" @@ -1460,11 +1470,11 @@ /turf/closed/wall, /area/maintenance/department/bridge) "aLB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "aMq" = ( @@ -2243,12 +2253,12 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "bdy" = ( @@ -2515,6 +2525,26 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"blx" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters{ + id = "evashutter"; + name = "E.V.A. Storage Shutter" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) "blK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -2858,13 +2888,13 @@ /turf/open/floor/engine, /area/engine/engineering) "bvH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/machinery/door/firedoor/border_only{ dir = 1 }, /obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bwu" = ( @@ -2992,7 +3022,7 @@ /turf/open/floor/wood, /area/crew_quarters/dorms) "bAq" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bAJ" = ( @@ -3343,7 +3373,6 @@ /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) "bIB" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 4 @@ -3352,6 +3381,7 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/bridge) "bIV" = ( @@ -3429,7 +3459,7 @@ "bKD" = ( /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -3662,6 +3692,12 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "bQI" = ( @@ -3717,18 +3753,18 @@ /turf/open/floor/plasteel/white, /area/science/research) "bRY" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bSM" = ( @@ -3874,7 +3910,7 @@ "bUw" = ( /obj/machinery/door/airlock/engineering{ name = "AI Ship Access"; - req_one_access_txt = "10;17;32" + req_access_txt = "65" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -3889,7 +3925,7 @@ c_tag = "Bridge North" }, /obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel/dark, @@ -4070,14 +4106,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/bridge) @@ -4330,14 +4366,14 @@ icon_state = "1-2" }, /obj/effect/turf_decal/trimline/purple/filled/corner/lower, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, /obj/machinery/firealarm{ dir = 8; pixel_x = 28 }, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/research) "chs" = ( @@ -4521,15 +4557,15 @@ /turf/open/floor/plasteel, /area/engine/atmos/distro) "cmb" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/structure/table, /obj/machinery/camera{ c_tag = "Engineering East"; dir = 8 }, /obj/item/rcl/pre_loaded, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engineering) "cms" = ( @@ -4853,12 +4889,6 @@ }, /turf/open/floor/wood, /area/library) -"cvx" = ( -/obj/machinery/computer/ai_server_console{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "cvF" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 10 @@ -5115,7 +5145,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -5506,7 +5536,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "cHZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -5999,9 +6029,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "cUC" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, /obj/structure/table/reinforced, /obj/structure/railing{ dir = 1 @@ -6011,6 +6038,9 @@ department = "Bridge"; name = "Bridge Fax Machine" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "cVa" = ( @@ -6477,14 +6507,14 @@ /turf/open/floor/plasteel/dark, /area/engine/engineering) "deS" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/bridge) @@ -6698,6 +6728,10 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "djb" = ( @@ -6904,6 +6938,12 @@ id = "teleshutter"; name = "Teleporter Access Shutter" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plating, /area/teleporter) "dog" = ( @@ -7003,10 +7043,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "dsb" = ( @@ -7184,7 +7224,7 @@ /turf/open/floor/plasteel, /area/engine/atmos/distro) "dxA" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/bridge) "dxH" = ( @@ -7512,12 +7552,6 @@ /turf/open/floor/plasteel, /area/engine/atmos/distro) "dFX" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, @@ -7530,6 +7564,12 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "dGa" = ( @@ -7695,7 +7735,7 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "dKK" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -7823,10 +7863,6 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 }, @@ -7836,6 +7872,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/white, /area/science/research) "dQh" = ( @@ -8165,12 +8205,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"dXK" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/mixing) "dYH" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 @@ -8199,13 +8233,13 @@ /turf/open/floor/plasteel, /area/science/mixing) "dZl" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, /obj/structure/extinguisher_cabinet{ pixel_y = 30 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "dZo" = ( @@ -8691,8 +8725,8 @@ /area/medical/genetics) "ekt" = ( /obj/docking_port/stationary/random{ - shuttle_id = "pod_lavaland3"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland3" }, /turf/open/space/basic, /area/space/nearstation) @@ -9720,7 +9754,7 @@ /obj/structure/sign/departments/minsky/command/charge{ pixel_y = -32 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "eEj" = ( @@ -10143,10 +10177,10 @@ /turf/open/floor/plasteel, /area/security/processing) "eNr" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "eNu" = ( @@ -11236,15 +11270,15 @@ /turf/closed/wall, /area/medical/genetics/cloning) "fqN" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "fqY" = ( @@ -11422,12 +11456,6 @@ "fvA" = ( /turf/open/floor/plasteel, /area/security/main) -"fvC" = ( -/obj/machinery/computer/ai_resource_distribution{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "fvG" = ( /obj/structure/chair{ dir = 4 @@ -11541,8 +11569,8 @@ /turf/open/floor/plasteel, /area/security/brig) "fyP" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -11577,7 +11605,7 @@ "fzA" = ( /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -12029,9 +12057,6 @@ /area/security/execution/transfer) "fGl" = ( /obj/structure/table/reinforced, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/machinery/cell_charger{ pixel_y = 4 }, @@ -12039,6 +12064,10 @@ charge = 100; maxcharge = 15000 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "fGs" = ( @@ -12228,11 +12257,11 @@ /turf/open/floor/wood, /area/bridge/meeting_room) "fNm" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/structure/sign/departments/minsky/command/bridge{ pixel_x = 32; pixel_y = -32 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "fNn" = ( @@ -12345,12 +12374,12 @@ /turf/open/floor/plasteel, /area/security/main) "fOF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "fPN" = ( @@ -12392,11 +12421,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "fRa" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/machinery/light, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/security/main) "fRr" = ( @@ -12423,9 +12452,6 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos/storage) "fRH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 10 - }, /obj/machinery/camera{ c_tag = "Bridge Central"; dir = 4 @@ -12435,6 +12461,9 @@ pixel_y = -24 }, /obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/bridge) "fRO" = ( @@ -12601,10 +12630,10 @@ /obj/machinery/status_display/ai{ pixel_y = -32 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "fVP" = ( @@ -12777,8 +12806,8 @@ /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) "gam" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/machinery/light, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "gan" = ( @@ -12870,10 +12899,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 8 }, @@ -12883,6 +12908,10 @@ /obj/effect/turf_decal/trimline/atmos/warning/lower/corner/flip{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/engine/engineering) "gcE" = ( @@ -12964,10 +12993,10 @@ /obj/machinery/modular_computer/console/preset/command{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/structure/railing{ dir = 6 }, -/obj/structure/railing{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 6 }, /turf/open/floor/plasteel/dark, @@ -13072,6 +13101,12 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "ghJ" = ( @@ -13175,9 +13210,9 @@ dir = 2; dwidth = 3; height = 5; - shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; + shuttle_id = "mining_home"; width = 7 }, /turf/open/space/basic, @@ -13661,6 +13696,12 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "gwb" = ( @@ -13793,10 +13834,10 @@ /turf/open/floor/carpet, /area/hallway/secondary/entry) "gAz" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/machinery/papershredder, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, -/obj/machinery/papershredder, /turf/open/floor/plasteel/dark, /area/bridge) "gAA" = ( @@ -14155,6 +14196,12 @@ /obj/structure/cable{ icon_state = "1-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "gIY" = ( @@ -14331,12 +14378,12 @@ /obj/machinery/door/firedoor/border_only, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge/meeting_room) "gOA" = ( @@ -14370,11 +14417,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "gQh" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 5 - }, /obj/structure/closet/emcloset, /obj/item/storage/toolbox/emergency, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/bridge) "gQG" = ( @@ -14593,14 +14640,11 @@ /turf/open/floor/carpet/purple, /area/chapel/main) "gXE" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/area/hallway/primary/central) "gXW" = ( /obj/effect/turf_decal/loading_area, /obj/machinery/button/door{ @@ -14634,6 +14678,12 @@ }, /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/secondarydatacore) +"gZc" = ( +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/quartermaster/storage) "gZh" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, @@ -15291,9 +15341,9 @@ dir = 8; dwidth = 2; height = 6; - shuttle_id = "ai_station"; name = "ai station bay"; roundstart_template = /datum/map_template/shuttle/ai/gax; + shuttle_id = "ai_station"; width = 5 }, /turf/open/space/basic, @@ -15374,7 +15424,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -15429,9 +15479,6 @@ /turf/open/floor/grass, /area/hydroponics/garden) "hqZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/white/filled/corner/lower{ dir = 1 @@ -15439,6 +15486,9 @@ /obj/effect/turf_decal/trimline/secred/warning/lower/corner/flip{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "hrf" = ( @@ -15526,9 +15576,6 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "htr" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 9 - }, /obj/structure/table, /obj/item/paper_bin{ pixel_x = -3; @@ -15539,6 +15586,9 @@ c_tag = "Head of Personnel Waiting Area"; dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "htK" = ( @@ -15692,7 +15742,7 @@ /obj/structure/chair{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 10 }, /turf/open/floor/plasteel, @@ -15849,8 +15899,8 @@ dir = 2; dwidth = 2; height = 13; - shuttle_id = "ferry_home"; name = "port bay 2"; + shuttle_id = "ferry_home"; width = 5 }, /turf/open/space/basic, @@ -16089,6 +16139,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "hER" = ( @@ -16405,11 +16458,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "hPZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 9 - }, /obj/structure/closet/emcloset, /obj/item/storage/toolbox/emergency, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/bridge) "hQr" = ( @@ -16716,9 +16769,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "hVZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/structure/table/reinforced, /obj/item/storage/firstaid/regular{ pixel_x = 3; @@ -16727,6 +16777,9 @@ /obj/item/storage/toolbox/mechanical{ pixel_y = -4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "hWe" = ( @@ -17242,10 +17295,10 @@ dirx = -2; diry = 2 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) "ilz" = ( @@ -17387,12 +17440,12 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "ipy" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "ipH" = ( @@ -17412,6 +17465,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "ipY" = ( @@ -18208,7 +18264,7 @@ /turf/open/indestructible/grass/sand, /area/hydroponics/garden) "iKT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "iKZ" = ( @@ -18417,6 +18473,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/port) +"iOW" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/science/mixing) "iOZ" = ( /obj/effect/turf_decal/trimline/brown/filled/line/lower{ dir = 5 @@ -18428,7 +18490,6 @@ /obj/structure/rack, /obj/item/aicard, /obj/item/disk/holodisk/tutorial/AICore, -/obj/item/circuitboard/computer/ai_upload_download, /obj/machinery/power/apc{ areastring = "/area/crew_quarters/heads/hor"; dir = 8; @@ -18625,8 +18686,8 @@ dir = 4; dwidth = 11; height = 22; - shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; + shuttle_id = "whiteship_home"; width = 35 }, /turf/open/space/basic, @@ -18685,7 +18746,7 @@ /turf/open/space/basic, /area/space/nearstation) "iUF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel, @@ -18864,6 +18925,21 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"jbE" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/guncase/shotgun, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/ballistic/shotgun/riot, +/obj/machinery/camera/motion/armory{ + c_tag = "Armory Internal" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "jbW" = ( /obj/structure/bodycontainer/crematorium{ dir = 8; @@ -19091,13 +19167,13 @@ /turf/open/floor/plasteel, /area/security/brig) "jjq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "jju" = ( @@ -19238,7 +19314,7 @@ /turf/open/floor/plasteel, /area/security/prison) "jnc" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -19306,9 +19382,6 @@ /turf/open/floor/plasteel, /area/hydroponics) "joK" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 9 - }, /obj/machinery/power/apc/highcap/five_k{ areastring = "/area/bridge"; dir = 1; @@ -19318,6 +19391,9 @@ /obj/structure/cable{ icon_state = "0-2" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/bridge) "joM" = ( @@ -19373,12 +19449,12 @@ /turf/open/floor/plating, /area/maintenance/department/eva) "jqf" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/structure/cable{ icon_state = "2-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "jqA" = ( @@ -19441,10 +19517,10 @@ /turf/open/space/basic, /area/space/nearstation) "jsq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/machinery/light{ dir = 4 }, -/obj/machinery/light{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -19634,19 +19710,7 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/hallway/primary/central) -"jyJ" = ( -/obj/machinery/computer/robotics{ - dir = 8 - }, -/obj/structure/sign/plaques/ai_password{ - pixel_x = 32 - }, -/turf/open/floor/carpet/purple, -/area/crew_quarters/heads/hor) "jyN" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/secred/filled/corner/lower, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -19654,6 +19718,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/main) "jyP" = ( @@ -19679,8 +19746,8 @@ /obj/docking_port/stationary{ dwidth = 12; height = 18; - shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; + shuttle_id = "emergency_home"; width = 32 }, /turf/open/space/basic, @@ -20077,7 +20144,8 @@ /obj/structure/fireaxecabinet/bridge{ pixel_x = 32 }, -/obj/effect/turf_decal/trimline/secred/filled/line/lower{ +/obj/effect/turf_decal/trimline/secred/warning/lower{ + alpha = 220; dir = 4 }, /turf/open/floor/plasteel/dark, @@ -20450,6 +20518,24 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"jRL" = ( +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "jSg" = ( /obj/machinery/door/airlock{ id_tag = "Dorm3"; @@ -21944,13 +22030,13 @@ /turf/open/floor/plasteel, /area/engine/engine_smes) "kHq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_y = -30 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/security/main) "kHD" = ( @@ -21958,6 +22044,9 @@ /obj/machinery/light/small, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"kHF" = ( +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "kHQ" = ( /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -22390,8 +22479,8 @@ "kUf" = ( /obj/docking_port/stationary/random{ dir = 2; - shuttle_id = "pod_lavaland3"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland3" }, /turf/open/space/basic, /area/space/nearstation) @@ -22403,7 +22492,7 @@ /turf/open/floor/plasteel, /area/science/mixing) "kUU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -22487,7 +22576,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, /turf/open/floor/plasteel, @@ -22543,12 +22632,12 @@ /turf/closed/wall, /area/chapel/office) "kYR" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 10 - }, /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/bridge) "kYZ" = ( @@ -22739,12 +22828,12 @@ /obj/machinery/modular_computer/console/preset/engineering{ dir = 8 }, -/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/bridge) "lcO" = ( @@ -22975,6 +23064,12 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/teleporter) "lhi" = ( @@ -23013,10 +23108,10 @@ /turf/open/floor/plasteel, /area/teleporter) "lhH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 10 }, -/obj/structure/closet/firecloset, /turf/open/floor/plasteel/dark, /area/bridge) "lhI" = ( @@ -23223,6 +23318,20 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"lmz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "lmD" = ( /obj/structure/cable{ icon_state = "4-8" @@ -23361,7 +23470,7 @@ /turf/open/floor/engine, /area/engine/supermatter) "lsK" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, /turf/open/floor/plasteel, @@ -23636,13 +23745,13 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "lxY" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "lyc" = ( @@ -23828,10 +23937,10 @@ /turf/open/floor/plating, /area/maintenance/department/medical/central) "lCs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 6 }, -/obj/structure/closet/firecloset, /turf/open/floor/plasteel/dark, /area/bridge) "lCy" = ( @@ -23917,11 +24026,11 @@ /turf/open/floor/plasteel, /area/teleporter) "lEO" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "lEP" = ( @@ -24273,6 +24382,12 @@ }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) +"lOz" = ( +/obj/machinery/computer/robotics{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/crew_quarters/heads/hor) "lOU" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 1 @@ -25000,7 +25115,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "mik" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 4 }, @@ -25013,6 +25127,7 @@ pixel_x = 34; pixel_y = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/bridge) "mir" = ( @@ -25284,10 +25399,12 @@ /obj/machinery/computer/crew{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/bridge) "mnb" = ( @@ -25418,10 +25535,10 @@ /turf/open/floor/plasteel/grimy, /area/chapel/office) "mqk" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "mqx" = ( @@ -25443,13 +25560,6 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) -"mqM" = ( -/obj/machinery/ai/data_core, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/secondarydatacore) "mrk" = ( /obj/effect/turf_decal/trimline/neutral/filled/line/lower{ dir = 4 @@ -25474,15 +25584,15 @@ /turf/closed/wall, /area/library) "mrs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/item/radio/intercom{ frequency = 1485; name = "Station Intercom (Medbay)"; pixel_y = 27 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "mrF" = ( @@ -25726,12 +25836,12 @@ /turf/open/floor/plating, /area/escapepodbay) "mxs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/research) "mxD" = ( @@ -26040,10 +26150,10 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "mFD" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/machinery/light{ dir = 8 }, -/obj/machinery/light{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -26943,7 +27053,7 @@ /turf/open/floor/plasteel, /area/storage/primary) "ngI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -27198,6 +27308,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "nmx" = ( @@ -27510,7 +27624,7 @@ pixel_x = 2; pixel_y = 5 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 9 }, /turf/open/floor/plasteel/dark, @@ -28338,7 +28452,7 @@ /turf/open/floor/plasteel, /area/engine/atmos/storage) "nMP" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -28957,7 +29071,7 @@ /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) "ohE" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 6 }, /turf/open/floor/plasteel, @@ -29110,7 +29224,7 @@ /obj/structure/sign/warning/securearea{ pixel_y = -32 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "omU" = ( @@ -29491,6 +29605,9 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "owe" = ( @@ -29632,7 +29749,7 @@ "ozS" = ( /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "65;13" + req_access_txt = "65" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -29654,7 +29771,7 @@ /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -29768,13 +29885,6 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"oCY" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/mixing) "oEt" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 5 @@ -30186,7 +30296,7 @@ /area/medical/virology) "oOY" = ( /obj/machinery/atmospherics/miner/toxins, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, /area/engine/atmos/distro) "oPq" = ( @@ -30246,6 +30356,20 @@ }, /turf/open/floor/plasteel, /area/storage/primary) +"oQR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "oQX" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, @@ -30715,10 +30839,10 @@ /obj/machinery/computer/communications{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/structure/railing{ dir = 4 }, -/obj/structure/railing{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -31688,9 +31812,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "pBL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/machinery/light{ dir = 8 }, @@ -31700,6 +31821,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "pBS" = ( @@ -31742,6 +31866,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) "pCr" = ( @@ -32148,7 +32276,7 @@ /area/security/brig) "pOz" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plasteel/dark, /area/engine/engineering) "pOB" = ( @@ -32574,6 +32702,9 @@ name = "Station Intercom (General)"; pixel_y = 20 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plasteel, /area/teleporter) "pXP" = ( @@ -32612,10 +32743,6 @@ /turf/open/floor/plasteel/white, /area/medical/storage) "pYt" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, /obj/machinery/door/airlock/command/glass{ name = "Bridge"; req_access_txt = "19" @@ -32648,6 +32775,10 @@ id = "bridge blast"; name = "bridge blast door" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "pYB" = ( @@ -33015,7 +33146,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel, @@ -33109,13 +33240,13 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 8 }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/security/main) "qjy" = ( @@ -33396,6 +33527,10 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet) +"qpf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "qpr" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -33883,6 +34018,9 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"qHu" = ( +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/secondarydatacore) "qHC" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ @@ -33918,13 +34056,13 @@ /turf/open/floor/plating, /area/chapel/office) "qIO" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/bridge) "qJl" = ( @@ -34381,13 +34519,13 @@ /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "qVS" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_x = -29 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "qVW" = ( @@ -34656,11 +34794,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "rcc" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/machinery/camera{ c_tag = "Bridge West Entrance"; dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "rcm" = ( @@ -34733,16 +34871,17 @@ /obj/structure/cable{ icon_state = "2-4" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/bridge) "rdG" = ( /obj/machinery/computer/security{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/structure/railing{ dir = 5 }, -/obj/structure/railing{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel/dark, @@ -34978,13 +35117,11 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) "rjf" = ( @@ -35337,7 +35474,7 @@ }, /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "65;13" + req_access_txt = "65" }, /turf/open/floor/plating, /area/engine/engineering) @@ -35924,9 +36061,6 @@ /turf/open/floor/plasteel/white, /area/medical/paramedic) "rFX" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/structure/table/reinforced, /obj/item/radio/off{ pixel_x = 5; @@ -35940,6 +36074,9 @@ pixel_x = -8; pixel_y = 5 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "rGc" = ( @@ -36911,9 +37048,9 @@ /obj/docking_port/stationary{ dwidth = 2; height = 5; - shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/gax; + shuttle_id = "laborcamp_home"; width = 9 }, /turf/open/space/basic, @@ -37523,9 +37660,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "stM" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 }, @@ -37533,6 +37667,9 @@ dir = 8; pixel_x = 28 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "sup" = ( @@ -39155,10 +39292,10 @@ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/bridge) "tiF" = ( @@ -39355,7 +39492,7 @@ "toK" = ( /obj/machinery/door/airlock{ name = "Service Hall"; - req_one_access_txt = "25;26;35;28;46;37;38;36" + req_access_txt = "79" }, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -39602,19 +39739,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) -"twg" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/guncase/shotgun, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/ballistic/shotgun/riot, -/obj/machinery/camera/motion/armory, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) "twv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -39975,11 +40099,11 @@ /turf/closed/wall/r_wall, /area/storage/tech) "tGw" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 }, /obj/machinery/light, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/bridge) "tGB" = ( @@ -40014,6 +40138,20 @@ }, /turf/open/floor/plating, /area/maintenance/department/eva) +"tHM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "tHR" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 1 @@ -40435,6 +40573,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "tSU" = ( @@ -40469,14 +40613,14 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/structure/disposalpipe/sorting/mail{ dir = 4; sortType = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/main) "tUb" = ( @@ -40559,7 +40703,7 @@ "tVs" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_one_access_txt = "10;32" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -40737,14 +40881,24 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"tYV" = ( +/obj/machinery/ai/networking{ + label = "Subcontroller"; + roundstart_connection = "Computer Science - 2" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacore) "tZf" = ( /obj/machinery/computer/cargo/request, -/obj/effect/turf_decal/trimline/brown/filled/line/lower{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/bridge) "tZm" = ( @@ -41247,7 +41401,7 @@ "umn" = ( /obj/machinery/door/airlock/engineering{ name = "AI Ship Access"; - req_one_access_txt = "10;17;32" + req_one_access_txt = "10;17;61" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -41258,6 +41412,10 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite/teleporter) "umy" = ( @@ -41371,10 +41529,10 @@ /turf/open/floor/plasteel, /area/hydroponics) "usc" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 6 }, -/obj/structure/closet/firecloset, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "usy" = ( @@ -41390,6 +41548,15 @@ }, /turf/open/floor/plasteel, /area/clerk) +"utd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "utx" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ @@ -41446,13 +41613,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"uvN" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "uvV" = ( /obj/effect/turf_decal/trimline/neutral/filled/line/lower{ dir = 4 @@ -41555,7 +41715,6 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos/distro) "uyk" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 4 }, @@ -41569,6 +41728,7 @@ pixel_x = 3; pixel_y = 3 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/engine/engineering) "uyo" = ( @@ -41677,13 +41837,13 @@ /obj/machinery/ministile/hop{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/machinery/door/poddoor/shutters/preopen{ id = "hopqueue"; name = "HoP Queue Shutters" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "uCM" = ( @@ -42501,12 +42661,12 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/research) "uUU" = ( @@ -42554,7 +42714,7 @@ "uWk" = ( /obj/machinery/door/airlock{ name = "Service Hall"; - req_one_access_txt = "25;26;35;28;46;37;38" + req_access_txt = "79" }, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -42753,6 +42913,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"vaA" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacore) "vaF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -43027,9 +43196,9 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "vgF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, /obj/structure/railing, /obj/structure/table/reinforced, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/bridge) "vgJ" = ( @@ -43165,10 +43334,10 @@ /turf/open/floor/plasteel/white, /area/science/lab) "vjf" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/plasteel/dark, /area/bridge) "vjq" = ( @@ -43729,6 +43898,13 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"vxw" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/science/mixing) "vyw" = ( /obj/effect/turf_decal/trimline/brown/filled/corner/lower, /obj/machinery/door/poddoor/shutters{ @@ -43868,10 +44044,6 @@ /turf/open/space/basic, /area/space/nearstation) "vBd" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, @@ -43881,6 +44053,10 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel/dark, /area/bridge) "vBr" = ( @@ -43950,12 +44126,12 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "vEr" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "vES" = ( @@ -44395,6 +44571,12 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "vOz" = ( @@ -44585,8 +44767,8 @@ dir = 2; dwidth = 4; height = 7; - shuttle_id = "supply_home"; name = "Cargo Bay"; + shuttle_id = "supply_home"; width = 12 }, /turf/open/space/basic, @@ -45046,7 +45228,7 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "wgx" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -45309,6 +45491,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/central/secondary) "wnM" = ( @@ -45411,6 +45596,12 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "wpd" = ( @@ -45594,9 +45785,6 @@ /obj/machinery/status_display/ai{ pixel_y = -32 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, /obj/effect/turf_decal/trimline/purple/filled/corner/lower, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -45604,6 +45792,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "wul" = ( @@ -45816,6 +46007,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "wBM" = ( @@ -45915,7 +46109,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "wEB" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 6 }, /turf/open/floor/plasteel/dark, @@ -46529,6 +46723,12 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/engineering) +"wTo" = ( +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "wTp" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 4 @@ -46631,7 +46831,10 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, /turf/open/floor/plasteel/white, @@ -46659,10 +46862,10 @@ /turf/closed/wall, /area/security/prison) "wXN" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "wXQ" = ( @@ -47257,12 +47460,12 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "xke" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/structure/chair{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "xkF" = ( @@ -47351,9 +47554,6 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "xlW" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, /obj/machinery/requests_console{ announcementConsole = 1; department = "Bridge"; @@ -47361,6 +47561,9 @@ name = "Bridge RC"; pixel_x = -32 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/bridge) "xmi" = ( @@ -48178,16 +48381,6 @@ }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) -"xId" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/science/mixing) "xIi" = ( /obj/structure/cable{ icon_state = "2-8" @@ -48207,12 +48400,12 @@ /obj/machinery/computer/shuttle/labor{ dir = 8 }, -/obj/effect/turf_decal/trimline/secred/filled/line/lower{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/bridge) "xIv" = ( @@ -48243,7 +48436,7 @@ }, /area/crew_quarters/kitchen) "xJC" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -48269,12 +48462,6 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "xLg" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, @@ -48287,6 +48474,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/bridge) "xLp" = ( @@ -48372,8 +48565,8 @@ "xMI" = ( /obj/docking_port/stationary/random{ dir = 4; - shuttle_id = "pod_lavaland2"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland2" }, /turf/open/space/basic, /area/space/nearstation) @@ -48980,10 +49173,10 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "xZs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/machinery/light{ dir = 1 }, -/obj/machinery/light{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel, @@ -49356,6 +49549,13 @@ }, /turf/open/floor/plasteel, /area/storage/primary) +"yii" = ( +/obj/machinery/ai/master_subcontroller, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacore) "yij" = ( /obj/machinery/atmospherics/components/binary/pump{ name = "Port to Filter" @@ -71156,7 +71356,7 @@ vRP ubS tkl dll -twg +jbE uwK spY vVo @@ -76097,7 +76297,7 @@ sup dHF iNn pQR -bco +gZc bco sNz bco @@ -81503,7 +81703,7 @@ wTB hBZ kSo dpf -dpf +tYV juY gYo wQM @@ -81760,8 +81960,8 @@ wTB hBZ nJe dpf -dpf -mqM +vaA +qHu ios mZK iGe @@ -82017,7 +82217,7 @@ aOB wOb nJe dpf -dpf +yii vFH ydu dpf @@ -82532,8 +82732,8 @@ nJe wIc dpf ylC -fvC -cvx +kHF +kHF dpf wYJ dpf @@ -82789,7 +82989,7 @@ nJe mpT dpf eVZ -uvN +qpf mjG sXP xFt @@ -83256,7 +83456,7 @@ gLy diO ghF woR -dAF +oQR dsU uhN vNR @@ -83302,7 +83502,7 @@ oXR hbW lwK wvV -dXK +iOW dpf tPI erf @@ -83513,7 +83713,7 @@ eIg pKU wda rpY -kmr +gXE ptM jmX gSg @@ -83559,7 +83759,7 @@ fNv vwU cXA cyI -xId +aCl uRs lKJ lAt @@ -83816,7 +84016,7 @@ sZa hbW rsX yfh -oCY +vxw dpf dpf dpf @@ -84027,7 +84227,7 @@ opJ oAO wda xea -kmr +wTo ptM bae cGW @@ -84282,9 +84482,9 @@ gBL sYa oer umn -ghF -woR -dAF +lmz +jRL +tHM dsU ayM tia @@ -84798,7 +84998,7 @@ pSR pSR aCD uZk -wAI +utd sEq hSZ tia @@ -89201,7 +89401,7 @@ tAW jNf eEB jlh -jyJ +lOz eNu bxI tAW @@ -93285,7 +93485,7 @@ ulx hTf gvW lTB -tuM +blx nkE sxD xZs @@ -93807,7 +94007,7 @@ bTq vCh uCA dIB -gXE +xZs rbp gam hVM diff --git a/_maps/map_files/IceMeta/IceMeta.dmm b/_maps/map_files/IceMeta/IceMeta.dmm index 6774ae00b0f8..64096f0c6552 100644 --- a/_maps/map_files/IceMeta/IceMeta.dmm +++ b/_maps/map_files/IceMeta/IceMeta.dmm @@ -705,24 +705,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"akU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/trimline/yellow/warning/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "akW" = ( /obj/structure/cable/yellow{ icon_state = "0-8" @@ -1847,6 +1829,20 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"aCh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "aCo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 @@ -3408,6 +3404,9 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "aYL" = ( @@ -3506,15 +3505,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/paramedic) -"baA" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/aisat_interior) "baV" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -3825,49 +3815,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"bfU" = ( -/obj/machinery/ai/data_core/primary, -/obj/machinery/power/apc/highcap{ - areastring = "/area/ai_monitored/turret_protected/ai"; - name = "AI Chamber APC"; - pixel_y = -23 - }, -/obj/structure/cable/yellow, -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = -29; - pixel_y = 8 - }, -/obj/item/radio/intercom{ - freerange = 1; - frequency = 1447; - name = "Private Channel"; - pixel_x = 27; - pixel_y = -16 - }, -/obj/machinery/button/door{ - id = "aicoredoor"; - name = "AI Chamber entrance shutters control"; - pixel_x = -23; - pixel_y = -12; - req_access_txt = "16" - }, -/obj/item/radio/intercom{ - freerange = 1; - name = "Common Channel"; - pixel_x = 27; - pixel_y = -36 - }, -/obj/item/radio/intercom{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = 27; - pixel_y = -26 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "bgn" = ( /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 4 @@ -4489,7 +4436,7 @@ "bqh" = ( /obj/machinery/door/airlock/external{ name = "MiniSat Space Access Airlock"; - req_one_access_txt = "32;19" + req_one_access_txt = "65;19" }, /obj/machinery/atmospherics/pipe/layer_manifold{ dir = 4 @@ -4641,19 +4588,6 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp) -"bsV" = ( -/obj/machinery/computer/security/telescreen/minisat{ - dir = 8; - pixel_x = 28 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "bsW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -5049,6 +4983,21 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/starboard) +"bzz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/yellow/warning/lower, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "bzI" = ( /obj/machinery/modular_computer/console/preset/mining{ dir = 8 @@ -5322,6 +5271,24 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"bDF" = ( +/obj/machinery/light/small, +/obj/machinery/camera{ + c_tag = "MiniSat Exterior Access"; + dir = 1; + network = list("minisat","ss13") + }, +/obj/machinery/power/apc{ + areastring = "/area/aisat"; + name = "MiniSat Exterior APC"; + pixel_y = -23 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/aisat) "bDK" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -5580,6 +5547,30 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"bHR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = -32; + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "bHT" = ( /obj/item/paper_bin{ pixel_x = -2; @@ -5625,7 +5616,7 @@ /turf/open/floor/plating/asteroid/snow/icemoon, /area/icemoon/underground/explored/laborcamp) "bID" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/item/radio/intercom{ pixel_x = 29 }, @@ -6689,8 +6680,8 @@ dir = 8; dwidth = 12; height = 17; - shuttle_id = "syndicate_nw"; name = "northwest of station"; + shuttle_id = "syndicate_nw"; width = 23 }, /turf/open/genturf, @@ -6837,6 +6828,20 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/secondary/command) +"cbp" = ( +/obj/structure/table, +/obj/item/crowbar/red, +/obj/item/wrench, +/obj/item/clothing/mask/gas, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-right-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, +/obj/effect/turf_decal/trimline/atmos/warning/lower/corner, +/turf/open/floor/plasteel, +/area/engine/atmos) "cbw" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ @@ -7019,18 +7024,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cdD" = ( -/obj/machinery/light/small, -/obj/machinery/computer/ai_resource_distribution{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Telecomms - Control Room"; - dir = 1; - network = list("ss13","tcomms") - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) "cee" = ( /obj/machinery/door/poddoor/shutters{ id = "teleshutter"; @@ -7126,10 +7119,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/paramedic) -"cfN" = ( -/obj/machinery/ai/data_core, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "cge" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -7294,17 +7283,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/heads/cmo) -"chF" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, -/turf/open/floor/plasteel/dark, -/area/aisat) "chQ" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -7620,6 +7598,17 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"cmw" = ( +/obj/machinery/door/window{ + name = "MiniSat Walkway Access" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/aisat) "cmC" = ( /obj/machinery/door/poddoor{ id = "geo_turbine_nw"; @@ -8248,29 +8237,6 @@ icon_state = "panelscorched" }, /area/maintenance/port) -"cyh" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 26 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ - dir = 8 - }, -/mob/living/simple_animal/bot/secbot/pingsky, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "cyj" = ( /obj/effect/turf_decal/plaque{ icon_state = "L4" @@ -8367,15 +8333,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plasteel/dark/telecomms, /area/science/server) -"czx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/sign/plaques/ai_password{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/white, -/area/crew_quarters/heads/hor) "czA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -8396,6 +8353,18 @@ }, /turf/open/floor/plasteel, /area/construction/storage_wing) +"czH" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/hidden{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "czQ" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -8892,9 +8861,9 @@ dheight = 4; dwidth = 4; height = 9; - shuttle_id = "aux_base_zone"; name = "aux base zone"; roundstart_template = /datum/map_template/shuttle/aux_base/default; + shuttle_id = "aux_base_zone"; width = 9 }, /turf/open/floor/plating, @@ -8924,14 +8893,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cIh" = ( -/obj/machinery/camera{ - c_tag = "Secondary AI Core"; - dir = 8; - network = list("ss13","rd") - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "cIn" = ( /obj/effect/landmark/start/scientist, /obj/structure/cable/yellow{ @@ -9491,6 +9452,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"cRt" = ( +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "cRu" = ( /obj/structure/closet, /turf/open/floor/plating{ @@ -9537,9 +9504,12 @@ c_tag = "Bridge - Central" }, /obj/structure/table/glass, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "cSg" = ( @@ -10588,7 +10558,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 10 }, /turf/open/floor/plasteel/dark, @@ -10695,7 +10665,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/door/airlock{ name = "Service Hall"; - req_one_access_txt = "25;26;35;28;46;37;38" + req_access_txt = "79" }, /turf/open/floor/plasteel, /area/hallway/secondary/service) @@ -10799,18 +10769,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/fore) -"dlZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/yellow/warning/lower, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "dma" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/eastright{ @@ -11139,6 +11097,17 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"dqR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "drm" = ( /obj/machinery/airalarm{ dir = 4; @@ -11242,6 +11211,35 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) +"dsR" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Foyer"; + req_one_access_txt = "65;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) "dsX" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -27 @@ -11432,7 +11430,7 @@ "dva" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Control Room"; - req_one_access_txt = "19; 61" + req_one_access_txt = "19;61" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -12162,10 +12160,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/mine/living_quarters) -"dEV" = ( -/obj/machinery/ai/server_cabinet, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "dEY" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -12387,7 +12381,7 @@ /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ dir = 9 }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower, +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "dHN" = ( @@ -12913,6 +12907,13 @@ /obj/effect/turf_decal/trimline/atmos/warning/lower/corner/flip, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"dQm" = ( +/obj/machinery/ai/server_cabinet/prefilled, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "dQn" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 4 @@ -13300,7 +13301,9 @@ /obj/structure/cable/yellow{ icon_state = "0-2" }, -/obj/machinery/power/apc/auto_name/west, +/obj/machinery/power/apc/auto_name/west{ + pixel_x = -25 + }, /turf/open/floor/plasteel, /area/engine/engine_smes) "dWi" = ( @@ -13319,27 +13322,6 @@ }, /turf/open/floor/plating/airless, /area/science/xenobiology) -"dWq" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/highsecurity{ - id_tag = "ai_core_airlock_exterior"; - name = "AI Core"; - req_access_txt = "65" - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "dWr" = ( /obj/machinery/computer/security/qm{ dir = 4 @@ -14315,6 +14297,26 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"enl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "eno" = ( /obj/machinery/door/airlock/highsecurity{ name = "AI Upload"; @@ -14358,7 +14360,6 @@ pixel_x = -2 }, /obj/item/book/manual/wiki/security_space_law, -/obj/item/cartridge/detective, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -14423,22 +14424,30 @@ /obj/structure/plasticflaps, /turf/open/floor/plasteel, /area/mine/production) +"eoF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/yellow/warning/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "eoO" = ( /obj/effect/turf_decal/trimline/white/arrow_cw{ dir = 9 }, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"epc" = ( -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, -/obj/effect/turf_decal/trimline/green/filled/line/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) "ept" = ( /turf/closed/wall/r_wall, /area/engine/engineering) @@ -14695,6 +14704,9 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "esC" = ( @@ -15009,6 +15021,19 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"exb" = ( +/obj/structure/chair/office/dark, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "exg" = ( /obj/structure/disposalpipe/segment, /obj/machinery/holopad, @@ -15082,10 +15107,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 6 }, -/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/aisat) "eyB" = ( @@ -15190,7 +15215,7 @@ /area/maintenance/central) "eBs" = ( /obj/machinery/computer/med_data, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -15574,10 +15599,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"eGN" = ( -/obj/machinery/ai/server_cabinet/prefilled, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "eGW" = ( /obj/machinery/light/small{ dir = 1 @@ -15824,19 +15845,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/dark, /area/chapel/main) -"eLc" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/sign/warning/securearea{ - pixel_y = 31 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "eLp" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -15855,14 +15863,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"eLP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) "eLQ" = ( /obj/machinery/light{ dir = 8 @@ -16110,6 +16110,12 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) +"eQe" = ( +/obj/machinery/status_display/ai{ + pixel_y = 31 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "eQA" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ @@ -16475,19 +16481,6 @@ }, /turf/open/floor/plating, /area/quartermaster/sorting) -"eXP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light/small, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "eXS" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -17118,6 +17111,22 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"fid" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/hidden, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "fij" = ( /obj/machinery/atmospherics/pipe/simple{ dir = 5 @@ -17857,12 +17866,6 @@ /obj/effect/landmark/start/shaft_miner, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) -"fsI" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "fsJ" = ( /obj/structure/chair{ dir = 4; @@ -18044,6 +18047,20 @@ }, /turf/open/floor/wood, /area/crew_quarters/theatre) +"fvK" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/transit_tube/curved/flipped, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "fvM" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, /obj/machinery/portable_atmospherics/canister/air, @@ -19042,6 +19059,13 @@ /obj/item/book/manual/wiki/security_space_law, /turf/open/floor/plasteel, /area/security/courtroom) +"fLl" = ( +/obj/machinery/ai/server_cabinet/prefilled, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "fLo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19077,16 +19101,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) -"fLD" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "fLH" = ( /obj/machinery/light{ dir = 8 @@ -20039,10 +20053,13 @@ name = "Chief Engineer RC"; pixel_y = 32 }, -/obj/machinery/computer/card/minor/ce, /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, +/obj/machinery/modular_computer/console/preset/command/ce, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "fYh" = ( @@ -20455,6 +20472,9 @@ icon_state = "1-2" }, /obj/structure/cable/yellow, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "gdG" = ( @@ -21181,18 +21201,6 @@ "gnP" = ( /turf/open/floor/plasteel, /area/hydroponics/garden) -"gnQ" = ( -/obj/machinery/door/window{ - name = "MiniSat Walkway Access" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/warning/lower, -/turf/open/floor/plasteel/dark, -/area/aisat) "gnS" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -21296,6 +21304,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"gpl" = ( +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacore) "gpm" = ( /obj/structure/window/reinforced, /obj/vehicle/ridden/wheelchair, @@ -21328,10 +21342,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 5 }, -/obj/item/kirbyplants/random, /turf/open/floor/plasteel/dark, /area/aisat) "gpP" = ( @@ -21523,6 +21537,19 @@ }, /turf/open/floor/plasteel, /area/engine/storage_shared) +"gtw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/structure/sign/warning/securearea{ + pixel_y = 31 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "gtA" = ( /obj/structure/table/wood, /obj/machinery/recharger, @@ -21564,15 +21591,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"guL" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/hidden, -/obj/machinery/flasher{ - id = "AI"; - pixel_x = -24; - pixel_y = -6 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "guZ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/rnd/production/circuit_imprinter/department/science, @@ -21587,16 +21605,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"gve" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "gvz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -22130,7 +22138,7 @@ icon_state = "1-8" }, /obj/machinery/computer/cargo/request, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel/dark, @@ -22390,8 +22398,8 @@ dir = 8; dwidth = 2; height = 13; - shuttle_id = "ferry_home"; name = "port bay 2"; + shuttle_id = "ferry_home"; width = 5 }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, @@ -22455,7 +22463,7 @@ }, /obj/machinery/door/airlock/external{ name = "MiniSat Space Access Airlock"; - req_one_access_txt = "32;19" + req_one_access_txt = "65;19" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -22763,9 +22771,6 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, @@ -22971,6 +22976,13 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"gOj" = ( +/obj/machinery/atmospherics/pipe/manifold/yellow/hidden, +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "gOm" = ( /turf/closed/wall/r_wall, /area/security/detectives_office) @@ -24492,13 +24504,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"hiu" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "hiF" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -24645,14 +24650,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/port/fore) -"hku" = ( -/obj/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, -/turf/open/floor/plasteel/dark, -/area/aisat) "hkw" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -24789,18 +24786,6 @@ icon_state = "platingdmg1" }, /area/maintenance/fore) -"hnc" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/landmark/start/cyborg, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/aisat_interior) "hnu" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 @@ -25121,6 +25106,15 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/storage) +"htN" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "htR" = ( /obj/structure/window/reinforced, /turf/open/floor/grass, @@ -25188,8 +25182,8 @@ area_type = /area/icemoon/underground/explored/laborcamp; dwidth = 2; height = 5; - shuttle_id = "laborcamp_away"; name = "labor camp"; + shuttle_id = "laborcamp_away"; width = 9 }, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -25589,6 +25583,9 @@ dir = 1 }, /obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "hAw" = ( @@ -25675,16 +25672,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"hBp" = ( -/obj/structure/chair/office/dark, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) "hBt" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -25707,13 +25694,6 @@ icon_state = "platingdmg1" }, /area/maintenance/port/fore) -"hBI" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "hBQ" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/structure/cable/yellow{ @@ -26243,7 +26223,8 @@ dir = 8; pixel_x = 26 }, -/obj/effect/turf_decal/trimline/purple/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 4 }, /turf/open/floor/plasteel/white, @@ -26275,6 +26256,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel{ dir = 1 }, @@ -26705,6 +26687,24 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) +"hPD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 4; + external_pressure_bound = 120; + name = "server vent" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/light/small, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "hPE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26830,21 +26830,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"hRr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - external_pressure_bound = 120; - name = "server vent" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light/small, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "hRE" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -27151,17 +27136,6 @@ /obj/machinery/light/small, /turf/open/floor/plating, /area/science/mixing) -"hXA" = ( -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Telecomms Admin"; - departmentType = 5; - name = "Telecomms RC"; - pixel_x = -32; - pixel_y = -29 - }, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) "hYw" = ( /obj/effect/turf_decal/plaque{ icon_state = "L12" @@ -27203,18 +27177,6 @@ /area/engine/atmos/distro) "hZV" = ( /obj/structure/closet/secure_closet/quartermaster, -/obj/item/cartridge/quartermaster{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/cartridge/quartermaster{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/cartridge/quartermaster{ - pixel_x = -4; - pixel_y = 7 - }, /obj/item/gps{ gpstag = "QM0" }, @@ -27574,8 +27536,8 @@ dir = 2; dwidth = 11; height = 22; - shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; + shuttle_id = "whiteship_home"; width = 35 }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, @@ -27660,6 +27622,12 @@ /obj/effect/turf_decal/trimline/green/filled/end/lower, /turf/open/floor/plasteel, /area/hydroponics) +"iiD" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/icemoon/top_layer, +/area/icemoon/top_layer/outdoors) "iiE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -27978,7 +27946,7 @@ icon_state = "1-2" }, /obj/structure/table/glass, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 8 }, /turf/open/floor/plasteel/dark, @@ -28046,21 +28014,6 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) -"ipf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/warning/lower{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "ipl" = ( /obj/structure/urinal{ pixel_y = 29 @@ -28474,8 +28427,8 @@ dir = 8; dwidth = 5; height = 7; - shuttle_id = "supply_home"; name = "Cargo Bay"; + shuttle_id = "supply_home"; width = 12 }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, @@ -28985,29 +28938,11 @@ pixel_y = 3 }, /obj/structure/table/glass, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, /area/bridge) -"iAc" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/transit_tube/station{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "iAd" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -29681,7 +29616,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/filled/line/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/white, @@ -29838,7 +29773,7 @@ "iMH" = ( /obj/machinery/door/airlock/medical/glass{ name = "Service Door"; - req_one_access_txt = "35;28" + req_access_txt = "35;79" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -29877,6 +29812,17 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) +"iNa" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "iNp" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -30426,7 +30372,7 @@ /obj/machinery/computer/monitor{ name = "Bridge Power Monitoring Console" }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -31018,24 +30964,6 @@ /obj/machinery/computer/shuttle/labor, /turf/open/floor/plasteel/dark, /area/security/brig) -"jdt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "ai_core_airlock_exterior"; - idSelf = "ai_core_airlock_control"; - pixel_x = 10; - pixel_y = -22 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "jdw" = ( /turf/open/floor/plating{ icon_state = "platingdmg3" @@ -31509,8 +31437,8 @@ dir = 2; dwidth = 9; height = 25; - shuttle_id = "emergency_home"; name = "MetaStation emergency evac bay"; + shuttle_id = "emergency_home"; width = 29 }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, @@ -31809,31 +31737,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"jpx" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Antechamber"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) "jpy" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -31910,27 +31813,6 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) -"jqp" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/flasher{ - id = "AI"; - pixel_x = -32; - pixel_y = 26 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "jqr" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment{ @@ -32518,15 +32400,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/medical/virology) -"jyh" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "jyi" = ( /obj/structure/closet/athletic_mixed, /obj/item/pool/rubber_ring, @@ -33060,6 +32933,15 @@ /obj/structure/window/reinforced, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) +"jFU" = ( +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "jGf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -33115,6 +32997,29 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"jGE" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner/lower{ + dir = 8 + }, +/mob/living/simple_animal/bot/secbot/pingsky, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "jGH" = ( /obj/machinery/light{ dir = 1 @@ -33295,7 +33200,7 @@ /area/crew_quarters/heads/chief) "jJj" = ( /obj/machinery/computer/security, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -33439,19 +33344,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"jKA" = ( -/obj/structure/table, -/obj/item/crowbar/red, -/obj/item/wrench, -/obj/item/clothing/mask/gas, -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-right-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, -/turf/open/floor/plasteel, -/area/engine/atmos) "jKF" = ( /obj/machinery/light/small{ dir = 4 @@ -33823,6 +33715,9 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 1 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "jQd" = ( @@ -33885,6 +33780,16 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"jQX" = ( +/obj/structure/sign/warning/biohazard{ + pixel_x = -32 + }, +/obj/effect/turf_decal/trimline/green/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "jRa" = ( /obj/machinery/autolathe, /turf/open/floor/carpet, @@ -34067,6 +33972,26 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/engine/engineering) +"jUt" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/distro) "jUu" = ( /turf/open/floor/plasteel, /area/security/brig) @@ -34624,9 +34549,6 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "kcT" = ( -/obj/machinery/computer/ai_resource_distribution{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -34902,24 +34824,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"kgu" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, -/mob/living/simple_animal/bot/cleanbot, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "kgz" = ( /obj/structure/closet/emcloset, /obj/machinery/light/small{ @@ -35244,6 +35148,17 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"kld" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "kle" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/effect/turf_decal/trimline/engiyellow/warning/lower{ @@ -35411,12 +35326,6 @@ pixel_y = 5; req_access_txt = "11" }, -/obj/machinery/modular_computer/console/preset/command/ce{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ dir = 8 }, @@ -35528,6 +35437,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"kpp" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "kps" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/trimline/yellow/filled/line/lower{ @@ -35569,6 +35485,16 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) +"kpZ" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "kqq" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/costume, @@ -35687,7 +35613,7 @@ /obj/item/folder/red{ pixel_y = 3 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -35847,6 +35773,18 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"kuE" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat_interior) "kuG" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -36373,6 +36311,19 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"kCK" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "kCL" = ( /obj/structure/chair{ dir = 1 @@ -36383,6 +36334,24 @@ "kCR" = ( /turf/closed/wall, /area/construction/storage_wing) +"kCT" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) "kDc" = ( /obj/effect/landmark/stationroom/maint/tenxten, /turf/baseturf_bottom, @@ -36805,6 +36774,35 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) +"kIh" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Antechamber"; + req_one_access_txt = "65;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) "kIs" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -37843,6 +37841,22 @@ "lal" = ( /turf/open/floor/circuit/telecomms, /area/science/xenobiology) +"laF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "ai_core_airlock_interior"; + idSelf = "ai_core_airlock_control"; + pixel_x = 9; + pixel_y = 25 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "laP" = ( /obj/machinery/door/airlock/external{ glass = 1; @@ -39139,7 +39153,7 @@ /area/tcommsat/computer) "luu" = ( /obj/machinery/computer/secure_data, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -39167,20 +39181,6 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) -"luY" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/transit_tube/curved/flipped, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "luZ" = ( /obj/structure/cable{ icon_state = "0-2" @@ -39385,36 +39385,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"lxp" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/turret_protected/aisat_interior"; - dir = 4; - name = "MiniSat Antechamber APC"; - pixel_x = 24 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Station Intercom (AI Private)"; - pixel_x = 28; - pixel_y = 11 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 5 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "lxx" = ( /turf/closed/wall, /area/medical/medbay/aft) @@ -40000,6 +39970,16 @@ }, /turf/open/floor/plasteel/dark, /area/aisat) +"lHM" = ( +/obj/machinery/ai/networking{ + label = "Subcontroller"; + roundstart_connection = "Computer Science - 2" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacore) "lHP" = ( /obj/machinery/door/airlock/security{ name = "Customs Desk"; @@ -40126,9 +40106,6 @@ /turf/open/floor/carpet, /area/library) "lJe" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "lJh" = ( @@ -40424,9 +40401,6 @@ pixel_y = 7 }, /obj/item/pen, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "lNo" = ( @@ -40533,7 +40507,7 @@ /turf/open/floor/plasteel/white, /area/medical/surgery) "lOQ" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small, /obj/effect/turf_decal/delivery, /obj/machinery/firealarm{ @@ -40761,17 +40735,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"lSo" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "lSr" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -41047,21 +41010,6 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/secondary/command) -"lVz" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/warning/lower{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) "lVB" = ( /obj/structure/window/reinforced{ dir = 8 @@ -41136,6 +41084,9 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -41312,6 +41263,25 @@ /obj/item/clothing/head/helmet/alt, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"lYv" = ( +/obj/machinery/camera{ + c_tag = "Virology - Entrance"; + dir = 8; + network = list("ss13","medbay") + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/green/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "lYy" = ( /obj/structure/sign/warning/securearea{ desc = "A warning sign which reads 'SERVER ROOM'."; @@ -41757,9 +41727,6 @@ /area/chapel/office) "meY" = ( /obj/machinery/holopad, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "mfh" = ( @@ -43357,7 +43324,7 @@ "mDl" = ( /obj/machinery/door/airlock{ name = "Kitchen"; - req_access_txt = "28" + req_access_txt = "28;79" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -44333,10 +44300,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"mPJ" = ( -/obj/machinery/atmospherics/pipe/simple/yellow/hidden, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "mPR" = ( /obj/structure/window/reinforced, /obj/machinery/power/terminal{ @@ -44410,7 +44373,7 @@ "mQN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) "mQS" = ( @@ -45378,6 +45341,18 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"ncI" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "ncZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -45454,7 +45429,7 @@ }, /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance"; - req_access_txt = "32" + req_one_access_txt = "65;19" }, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) @@ -45827,6 +45802,12 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"nkE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/crew_quarters/heads/hor) "nkJ" = ( /obj/machinery/camera{ c_tag = "Mech Bay"; @@ -46208,6 +46189,10 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower, /turf/open/floor/plasteel/white, /area/science/research) "nrW" = ( @@ -46319,12 +46304,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"nts" = ( -/obj/machinery/atmospherics/pipe/manifold/yellow/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "ntL" = ( /obj/machinery/door/poddoor/shutters{ id = "teleshutter"; @@ -46596,13 +46575,6 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) -"nwW" = ( -/obj/machinery/status_display/ai{ - pixel_y = 31 - }, -/obj/machinery/computer/ai_control_console, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) "nxb" = ( /obj/machinery/light/small{ dir = 8 @@ -47004,18 +46976,6 @@ pixel_x = -1; pixel_y = 10 }, -/obj/item/cartridge/engineering{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/item/cartridge/engineering{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/cartridge/engineering{ - pixel_x = 3 - }, -/obj/item/cartridge/atmos, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "nDh" = ( @@ -47391,10 +47351,10 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower, /turf/open/floor/plasteel/white, /area/science/research) "nIR" = ( @@ -47581,6 +47541,30 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"nMa" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "aicoredoor"; + name = "AI Chamber entrance shutters" + }, +/obj/machinery/door/airlock/highsecurity{ + id_tag = "ai_core_airlock_interior"; + name = "AI Core"; + req_access_txt = "65" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "nMf" = ( /obj/effect/turf_decal/trimline/green/filled/corner/lower{ dir = 4 @@ -47744,12 +47728,30 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"nOd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "ai_core_airlock_exterior"; + idSelf = "ai_core_airlock_control"; + pixel_x = 10; + pixel_y = -22 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "nOf" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/machinery/computer/card, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 9 }, /turf/open/floor/plasteel/dark, @@ -47979,7 +47981,7 @@ "nRB" = ( /obj/machinery/door/airlock{ name = "Bar Storage"; - req_access_txt = "25" + req_access_txt = "25;79" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -48313,7 +48315,7 @@ }, /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance"; - req_access_txt = "32" + req_one_access_txt = "65;19" }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) @@ -48380,6 +48382,21 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"nWF" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "MiniSat - Antechamber"; + dir = 4; + network = list("minisat","ss13") + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "nWG" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 4; @@ -48458,21 +48475,6 @@ /obj/item/clothing/mask/breath, /turf/open/floor/plasteel/dark, /area/teleporter) -"nXI" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "MiniSat - Antechamber"; - dir = 4; - network = list("minisat","ss13") - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 9 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "nXZ" = ( /obj/machinery/chem_dispenser{ layer = 2.7 @@ -48545,6 +48547,9 @@ /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "nZd" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "nZg" = ( @@ -48852,21 +48857,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"ocT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "ocV" = ( /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 8 @@ -49563,9 +49553,12 @@ pixel_y = 4 }, /obj/structure/table/glass, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/trimline/secred/filled/corner/lower{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/bridge) "ons" = ( @@ -49846,6 +49839,18 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"orF" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = -24; + pixel_y = -6 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "orH" = ( /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 @@ -49935,7 +49940,7 @@ "osK" = ( /obj/machinery/door/airlock/external{ name = "MiniSat Space Access Airlock"; - req_access_txt = "32" + req_one_access_txt = "10;32" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -50227,6 +50232,25 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"oxg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat/foyer) "oxp" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -50502,6 +50526,24 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel/white, /area/medical/virology) +"oAR" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/transit_tube/station{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "oAY" = ( /obj/structure/sign/directions/medical{ pixel_y = 8 @@ -50774,16 +50816,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/security/brig) -"oGh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/aisat) "oGn" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -50796,6 +50828,50 @@ }, /turf/open/floor/wood, /area/library) +"oGv" = ( +/obj/machinery/ai/data_core/primary, +/obj/machinery/power/apc/highcap{ + areastring = "/area/ai_monitored/turret_protected/ai"; + name = "AI Chamber APC"; + pixel_y = -23 + }, +/obj/structure/cable/yellow, +/obj/machinery/turretid{ + icon_state = "control_stun"; + name = "AI Chamber turret control"; + pixel_x = -29; + pixel_y = 8 + }, +/obj/item/radio/intercom{ + freerange = 1; + frequency = 1447; + name = "Private Channel"; + pixel_x = 27; + pixel_y = -16 + }, +/obj/machinery/button/door{ + id = "aicoredoor"; + name = "AI Chamber entrance shutters control"; + pixel_x = -23; + pixel_y = -12; + req_access_txt = "16" + }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Common Channel"; + pixel_x = 27; + pixel_y = -36 + }, +/obj/item/radio/intercom{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = 27; + pixel_y = -26 + }, +/obj/structure/ethernet_cable, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "oGx" = ( /obj/structure/closet, /obj/item/poster/random_contraband, @@ -50805,7 +50881,7 @@ "oGC" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Shared Engineering Storage"; - req_one_access_txt = "32;19;24" + req_one_access_txt = "10;32" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -50989,7 +51065,7 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "oLq" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/engine/engineering) "oLv" = ( @@ -51103,19 +51179,6 @@ dir = 5 }, /area/crew_quarters/kitchen) -"oND" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/transit_tube/curved{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "oNM" = ( /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/solar/starboard/aft) @@ -51501,6 +51564,16 @@ /obj/machinery/rnd/server/master, /turf/open/floor/circuit/telecomms/server, /area/science/server) +"oUv" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "oUy" = ( /obj/structure/chair{ dir = 8 @@ -51848,24 +51921,21 @@ }, /turf/open/floor/engine/air, /area/engine/atmos/distro) -"oZN" = ( -/obj/machinery/light/small, -/obj/machinery/camera{ - c_tag = "MiniSat Exterior Access"; - dir = 1; - network = list("minisat","ss13") +"oZD" = ( +/obj/machinery/ai_slipper{ + uses = 10 }, -/obj/machinery/power/apc{ - areastring = "/area/aisat"; - name = "MiniSat Exterior APC"; - pixel_y = -23 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/effect/landmark/start/cyborg, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/structure/ethernet_cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, -/turf/open/floor/plasteel/dark, -/area/aisat) +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat_interior) "oZQ" = ( /obj/machinery/airalarm{ dir = 1; @@ -51996,7 +52066,7 @@ "pbC" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Foyer"; - req_one_access_txt = "32;19" + req_one_access_txt = "10;32" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -52557,9 +52627,6 @@ }, /turf/open/floor/carpet, /area/security/detectives_office) -"pke" = ( -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "pkk" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -53083,6 +53150,13 @@ }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) +"prI" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "prJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54067,25 +54141,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"pGF" = ( -/obj/machinery/camera{ - c_tag = "Virology - Entrance"; - dir = 8; - network = list("ss13","medbay") - }, -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/green/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning/lower, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) "pGQ" = ( /obj/item/beacon, /obj/machinery/atmospherics/pipe/simple/purple/visible{ @@ -54308,14 +54363,6 @@ }, /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) -"pLc" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel/grimy, -/area/tcommsat/computer) "pLp" = ( /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) @@ -54407,6 +54454,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/central) "pMK" = ( @@ -55045,12 +55093,12 @@ pixel_x = 22; pixel_y = -1 }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 6 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) "pWo" = ( @@ -55496,7 +55544,7 @@ "qeI" = ( /obj/machinery/door/airlock/external{ name = "MiniSat Space Access Airlock"; - req_access_txt = "32" + req_one_access_txt = "10;32" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -55962,7 +56010,7 @@ icon_state = "1-2" }, /obj/structure/table/glass, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -56257,6 +56305,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"qpK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos/distro) "qpM" = ( /obj/structure/sign/directions/engineering{ dir = 4 @@ -56275,31 +56337,6 @@ /obj/structure/transit_tube/diagonal, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) -"qpZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/machinery/flasher{ - id = "AI"; - pixel_x = -1; - pixel_y = 32 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "ai_core_airlock_exterior"; - idSelf = "ai_core_airlock_control"; - pixel_x = 10; - pixel_y = 22 - }, -/obj/machinery/doorButtons/airlock_controller{ - idExterior = "ai_core_airlock_exterior"; - idInterior = "ai_core_airlock_interior"; - idSelf = "ai_core_airlock_control"; - pixel_x = 9; - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "qqg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56460,6 +56497,12 @@ c_tag = "Captain's Office - Emergency Escape"; dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plating{ icon_state = "platingdmg2" }, @@ -56806,7 +56849,7 @@ /area/science/robotics/lab) "qwA" = ( /obj/machinery/computer/station_alert, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -56859,16 +56902,6 @@ }, /turf/open/floor/plasteel/dark, /area/storage/tcom) -"qxy" = ( -/obj/structure/sign/departments/minsky/engineering/telecommmunications{ - pixel_y = -32 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "qxE" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -57332,6 +57365,31 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"qFb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = -1; + pixel_y = 32 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "ai_core_airlock_exterior"; + idSelf = "ai_core_airlock_control"; + pixel_x = 10; + pixel_y = 22 + }, +/obj/machinery/doorButtons/airlock_controller{ + idExterior = "ai_core_airlock_exterior"; + idInterior = "ai_core_airlock_interior"; + idSelf = "ai_core_airlock_control"; + pixel_x = 9; + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "qFe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57549,7 +57607,7 @@ pixel_y = 24 }, /obj/machinery/modular_computer/console/preset/mining, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/brown/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -57860,9 +57918,6 @@ pixel_y = 3 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) "qKv" = ( @@ -58401,8 +58456,9 @@ /obj/item/kirbyplants{ icon_state = "plant-10" }, -/obj/effect/turf_decal/trimline/purple/filled/line/lower{ - dir = 6 +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/science/research) @@ -59727,6 +59783,30 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"rql" = ( +/obj/machinery/camera{ + c_tag = "AI Chamber - Aft"; + dir = 8; + network = list("aicore") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "rqM" = ( /obj/structure/urinal{ pixel_y = 29 @@ -60642,6 +60722,30 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"rGw" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/airlock/highsecurity{ + id_tag = "ai_core_airlock_exterior"; + name = "AI Core"; + req_access_txt = "65" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "rGz" = ( /obj/effect/landmark/start/cargo_technician, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, @@ -61111,6 +61215,22 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"rNZ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/light/small, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "rOg" = ( /obj/machinery/firealarm{ dir = 1; @@ -61469,7 +61589,7 @@ /turf/open/floor/plasteel/white, /area/science/research) "rTy" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/storage) @@ -62054,7 +62174,9 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "san" = ( -/obj/machinery/airalarm/directional/west, +/obj/machinery/airalarm/directional/west{ + pixel_x = -24 + }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -62548,6 +62670,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/white, /area/medical/storage/locker) +"siJ" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "siR" = ( /turf/open/floor/plasteel/dark, /area/mine/laborcamp) @@ -62596,15 +62724,6 @@ pixel_y = -30 }, /obj/structure/table, -/obj/item/cartridge/signal/toxins, -/obj/item/cartridge/signal/toxins{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/cartridge/signal/toxins{ - pixel_x = 4; - pixel_y = 6 - }, /obj/item/storage/pencil_holder/crew/fancy{ pixel_x = -8; pixel_y = 10 @@ -65396,6 +65515,21 @@ icon_state = "platingdmg3" }, /area/maintenance/port/aft) +"sXk" = ( +/obj/machinery/camera{ + c_tag = "AI Chamber - Port"; + dir = 4; + network = list("aicore") + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/obj/machinery/ai/networking{ + label = "Computer Science - 2"; + roundstart_connection = "Subcontroller" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "sXp" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/westleft{ @@ -66159,6 +66293,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"tgV" = ( +/obj/machinery/light/small, +/obj/machinery/camera{ + c_tag = "Telecomms - Control Room"; + dir = 1; + network = list("ss13","tcomms") + }, +/obj/machinery/modular_computer/console/preset/netmin{ + dir = 1 + }, +/obj/structure/ethernet_cable, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "tgZ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -66168,6 +66315,15 @@ "thl" = ( /turf/closed/wall, /area/maintenance/aft) +"tia" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ + dir = 4 + }, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "tib" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -66524,6 +66680,16 @@ }, /turf/open/floor/plasteel/dark, /area/security/execution/education) +"tnv" = ( +/obj/machinery/atmospherics/pipe/simple/yellow/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "tnx" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 1 @@ -67459,9 +67625,9 @@ dir = 8; dwidth = 3; height = 15; - shuttle_id = "arrivals_stationary"; name = "arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/box; + shuttle_id = "arrivals_stationary"; width = 7 }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, @@ -68342,6 +68508,18 @@ /obj/structure/table/wood, /turf/open/floor/plasteel/dark, /area/chapel/main) +"tQQ" = ( +/obj/machinery/camera{ + c_tag = "Secondary AI Core"; + dir = 8; + network = list("ss13","rd") + }, +/obj/machinery/ai/master_subcontroller, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/secondarydatacore) "tQZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/yellow, @@ -68583,6 +68761,36 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/ai_monitored/secondarydatacore) +"tTN" = ( +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/turret_protected/aisat_interior"; + dir = 4; + name = "MiniSat Antechamber APC"; + pixel_x = 24 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1447; + listening = 0; + name = "Station Intercom (AI Private)"; + pixel_x = 28; + pixel_y = 11 + }, +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "tTP" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, @@ -68968,14 +69176,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"tYT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/atmos/distro) "tZe" = ( /turf/open/floor/plating, /area/maintenance/port/fore) @@ -69740,6 +69940,18 @@ }, /turf/open/floor/plasteel, /area/hydroponics) +"ukA" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "ukG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -69853,20 +70065,6 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) -"uma" = ( -/obj/machinery/door/window{ - dir = 1; - name = "MiniSat Walkway Access" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/warning/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "umc" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -70193,7 +70391,6 @@ "uql" = ( /obj/structure/table, /obj/item/aicard, -/obj/item/circuitboard/computer/ai_upload_download, /obj/item/disk/holodisk/tutorial/AICore, /turf/open/floor/plasteel/cafeteria{ dir = 5 @@ -70211,7 +70408,7 @@ /area/aisat) "uqz" = ( /obj/machinery/computer/crew, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -70707,22 +70904,17 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/security/nuke_storage) -"uyi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/obj/machinery/light{ - dir = 8 +"uyh" = ( +/obj/machinery/door/window{ + dir = 1; + name = "MiniSat Walkway Access" }, -/obj/machinery/doorButtons/access_button{ - idDoor = "ai_core_airlock_interior"; - idSelf = "ai_core_airlock_control"; - pixel_x = 9; - pixel_y = 25 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 }, /turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) +/area/aisat) "uyn" = ( /obj/structure/lattice, /obj/structure/grille, @@ -71021,7 +71213,7 @@ "uDR" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "MiniSat Maintenance"; - req_access_txt = "32" + req_one_access_txt = "65;19" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -71741,31 +71933,6 @@ }, /turf/open/floor/plasteel/white/side, /area/medical/medbay/central) -"uMI" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Foyer"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) "uMW" = ( /obj/machinery/disposal/deliveryChute{ dir = 4 @@ -71924,6 +72091,12 @@ /obj/structure/grille, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, /area/icemoon/top_layer/outdoors) +"uOe" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "uOh" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -72783,6 +72956,24 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) +"vaT" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -24 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner/lower, +/mob/living/simple_animal/bot/cleanbot, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "vaY" = ( /obj/structure/table/reinforced, /obj/item/reagent_containers/glass/bottle/epinephrine{ @@ -73027,6 +73218,20 @@ }, /turf/open/floor/plasteel/white, /area/medical/paramedic) +"vdG" = ( +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Telecomms Admin"; + departmentType = 5; + name = "Telecomms RC"; + pixel_x = -32; + pixel_y = -29 + }, +/obj/machinery/vr_sleeper/netmin{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "vdQ" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -73137,13 +73342,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"vfC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/yellow/filled/line/lower, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "vfR" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -73969,6 +74167,27 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) +"vtr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/atmos/warning/lower/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "vts" = ( /obj/effect/turf_decal/trimline/green/warning, /turf/closed/wall/r_wall, @@ -74261,6 +74480,12 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) +"vwO" = ( +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "vwS" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/hidden{ dir = 1 @@ -74904,23 +75129,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"vGo" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "vGr" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -75119,7 +75327,7 @@ /area/maintenance/starboard/fore) "vJR" = ( /obj/machinery/computer/atmos_alert, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/engiyellow/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -75475,7 +75683,7 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "vPq" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/atmospherics/miner/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos/distro) @@ -76335,7 +76543,7 @@ "waV" = ( /obj/machinery/door/airlock/hatch{ name = "MiniSat Access"; - req_one_access_txt = "32;19" + req_one_access_txt = "10;32" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -76657,30 +76865,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"wfl" = ( -/obj/machinery/camera{ - c_tag = "AI Chamber - Aft"; - dir = 8; - network = list("aicore") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "wfz" = ( /obj/machinery/photocopier, /obj/machinery/camera{ @@ -77902,17 +78086,6 @@ }, /turf/open/floor/plasteel/dark, /area/aisat) -"wwd" = ( -/obj/machinery/camera{ - c_tag = "AI Chamber - Port"; - dir = 4; - network = list("aicore") - }, -/obj/structure/frame/machine{ - anchored = 1 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "wwf" = ( /turf/open/floor/engine/vacuum, /area/engine/atmos/distro) @@ -79888,18 +80061,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"wZP" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/aisat) "wZY" = ( /obj/structure/chair/office/light{ dir = 8 @@ -80194,6 +80355,11 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"xeg" = ( +/obj/machinery/compsci_reciever, +/obj/structure/table, +/turf/open/floor/plasteel/grimy, +/area/tcommsat/computer) "xeh" = ( /obj/machinery/holopad, /obj/effect/turf_decal/stripes/line{ @@ -80421,14 +80587,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"xiL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/turf/open/floor/plasteel, -/area/engine/atmos/distro) "xiN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -80553,7 +80711,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) "xkp" = ( @@ -80743,9 +80901,9 @@ dir = 8; dwidth = 2; height = 5; - shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; + shuttle_id = "laborcamp_home"; width = 9 }, /turf/open/floor/plating/asteroid/snow/icemoon/top_layer, @@ -80796,6 +80954,19 @@ /obj/effect/turf_decal/trimline/green/filled/line/lower, /turf/open/floor/plasteel/white, /area/medical/virology) +"xnl" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/aisat) "xnp" = ( /obj/structure/closet/radiation, /turf/open/floor/plasteel/dark, @@ -81169,6 +81340,21 @@ }, /turf/open/floor/plasteel/white, /area/medical/virology) +"xsH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/blue/warning/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "xsK" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/mapping_helpers/airlock/abandoned, @@ -82082,6 +82268,19 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos/distro) +"xCL" = ( +/obj/machinery/computer/security/telescreen/minisat{ + dir = 8; + pixel_x = 28 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "xCX" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82385,6 +82584,25 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"xGx" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecomms Control Room"; + req_one_access_txt = "19; 61" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "xGM" = ( /obj/machinery/atmospherics/components/binary/pump/on/layer2{ dir = 4 @@ -82636,24 +82854,6 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) -"xJC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/warning/lower{ - dir = 4 - }, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat/foyer) "xJH" = ( /obj/structure/sink{ dir = 4; @@ -83294,7 +83494,7 @@ icon_state = "2-4" }, /obj/machinery/computer/prisoner, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel/dark, @@ -83540,27 +83740,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"xVQ" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aicoredoor"; - name = "AI Chamber entrance shutters" - }, -/obj/machinery/door/airlock/highsecurity{ - id_tag = "ai_core_airlock_interior"; - name = "AI Core"; - req_access_txt = "65" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "xVS" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -83681,6 +83860,16 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"xXd" = ( +/obj/structure/sign/departments/minsky/engineering/telecommmunications{ + pixel_y = -32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "xXk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -84083,6 +84272,14 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/science/robotics/lab) +"ycR" = ( +/obj/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/turf/open/floor/plasteel/dark, +/area/aisat) "ycT" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor/border_only{ @@ -237304,7 +237501,7 @@ okB lxx wLu xJi -epc +jQX lxx gMl fFr @@ -237561,7 +237758,7 @@ fFw fjl aRC beQ -pGF +lYv sBO elA rsQ @@ -242375,7 +242572,7 @@ ueX ozK ozK ozK -ozK +iiD ueX ozK fno @@ -246812,7 +247009,7 @@ cTz iAK cTz hJi -cTz +veY nIG iKu qTA @@ -248597,7 +248794,7 @@ kkV oCz iaj aTa -czx +nkE ofN nqo abl @@ -252453,7 +252650,7 @@ lXG krH xNs xNs -pke +lHM tTz nWG eoo @@ -252710,7 +252907,7 @@ cgO cOc xNs xNs -cfN +gpl pwI eCi xNs @@ -252967,7 +253164,7 @@ cFq seQ xNs xNs -dEV +gpl qbC jnM iFF @@ -253224,7 +253421,7 @@ tcs dbQ xNs xNs -cIh +tQQ vYc oyE xNs @@ -256531,7 +256728,7 @@ uqC jTo ipA sJN -jKA +cbp oMh wRE jIJ @@ -257309,7 +257506,7 @@ hms ctq tRO weT -tYT +qpK hjv iQG nIs @@ -257560,7 +257757,7 @@ kyT xcS sJN gUo -ocT +vtr lFQ jIJ waM @@ -257821,7 +258018,7 @@ hML enq fAF bRV -xiL +jUt sVK tXc cim @@ -267318,9 +267515,9 @@ bqh iEX ozK mkm -luY -iAc -oND +fvK +oAR +kCK oET tRh iEX @@ -267575,9 +267772,9 @@ gVZ iEX uyn iEX -wZP +ncI uqw -oZN +bDF dML uOd jYF @@ -267832,9 +268029,9 @@ gHo iEX pnk jFT -lSo +iNa pVr -chF +xnl jnW pnk iEX @@ -268089,9 +268286,9 @@ nbb pJY nDh nDh -uma +uyh krX -gnQ +cmw nDh nDh pJY @@ -268346,9 +268543,9 @@ lHE dLB unR tcZ -fLD +oUv lRh -hku +ycR aoB unR tcZ @@ -268604,7 +268801,7 @@ tRh tRh tSE gpE -oGh +aCh eys euQ tRh @@ -268861,7 +269058,7 @@ tRh tRh jYF jYF -uMI +dsR uZL jYF tRh @@ -269118,7 +269315,7 @@ tRh tRh eeG wuI -lVz +kCT diS jYF jYF @@ -269622,8 +269819,8 @@ jYF kfW kfW kfW -wwd -eGN +sXk +dQm uAZ dxt kfW @@ -269632,7 +269829,7 @@ tRh tRh imJ ckh -xJC +oxg pVY qoe bRk @@ -269879,8 +270076,8 @@ jYF kfW iQH nVe -lTE -lTE +jFU +uOe lTE eSn ijs @@ -269889,13 +270086,13 @@ jYF jYF jYF aCS -jpx +kIh vSu qoe qoq dpk mUd -hXA +vdG ahQ xjJ xjJ @@ -270136,7 +270333,7 @@ kfW kfW cgP gKc -hBI +kpZ aHd qcJ pxE @@ -270145,9 +270342,9 @@ kfW mej aeQ kfW -nXI -ipf -kgu +nWF +xsH +vaT qoe iPP kqr @@ -270393,18 +270590,18 @@ kfW xcD keO axY -hRr +hPD kfW kfW piH rOv kfW -uyi -jdt +laF +nOd kfW -qpZ +qFb kYw -qxy +xXd qoe sXV bBE @@ -270650,21 +270847,21 @@ kfW lTU wWM siY -gve -bfU +fid +oGv kfW -hiu -jyh -xVQ -jqp -vGo -dWq -baA -hnc -dlZ -dva -eLP -pLc +tnv +ukA +nMa +bHR +enl +rGw +kuE +oZD +bzz +xGx +dqR +kld yiZ iiE tHd @@ -270907,23 +271104,23 @@ kfW mVK pQb fyN -eXP +rNZ kfW kfW -piH +tia npo kfW -wfl -bsV +rql +xCL kfW -eLc +gtw rbf -vfC +prI qoe quD -kqr +vwO mJT -kqr +xeg gOJ ahQ gOJ @@ -271164,23 +271361,23 @@ kfW kfW lTE vwS -nts -guL -mPJ -axY +czH +orF +kpp +gOj npo kfW kfW mSY kfW -lxp -akU -cyh +tTN +eoF +jGE qoe -nwW -kqr -hBp -cdD +eQe +cRt +exb +tgV gOJ hQh urt @@ -271421,8 +271618,8 @@ jYF kfW vjd nvm -fsI -lTE +htN +siJ lTE gPz pOe @@ -271679,7 +271876,7 @@ kfW kfW kfW vbX -eGN +fLl dxt mHX kfW diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm index 10e026c5d90b..fac02170a3f2 100644 --- a/_maps/map_files/YogStation/YogStation.dmm +++ b/_maps/map_files/YogStation/YogStation.dmm @@ -7,6 +7,7 @@ dir = 1 }, /obj/structure/railing, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/library) "aad" = ( @@ -295,12 +296,6 @@ /obj/item/stock_parts/cell/high/plus, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) -"abx" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/ai/server_cabinet/prefilled, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "aby" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -779,8 +774,8 @@ dir = 4; dwidth = 12; height = 18; - shuttle_id = "emergency_home"; name = "BoxStation emergency evac bay"; + shuttle_id = "emergency_home"; width = 32 }, /turf/open/space/basic, @@ -832,10 +827,6 @@ /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "afF" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff"; - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, @@ -1543,22 +1534,6 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) -"alf" = ( -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "test chamber blast door" - }, -/obj/machinery/door/airlock/research/glass{ - name = "Test Chamber"; - req_access_txt = "47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/misc_lab) "alh" = ( /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 @@ -1607,6 +1582,13 @@ }, /turf/open/space/basic, /area/solar/port/fore) +"alq" = ( +/obj/machinery/vr_sleeper/netmin{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "alt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -1722,6 +1704,37 @@ "ame" = ( /turf/open/floor/plasteel, /area/security/courtroom) +"aml" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Research Director"; + req_access_txt = "30" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/heads/hor) "amn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -2098,6 +2111,16 @@ "aoV" = ( /turf/open/space, /area/space) +"aoX" = ( +/obj/structure/frame/machine{ + anchored = 1; + state = 2 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "aoZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -2733,18 +2756,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) -"aue" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/starboard/aft) "auf" = ( /obj/machinery/firealarm{ dir = 4; @@ -2782,14 +2793,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/wood, /area/crew_quarters/dorms) -"aum" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/teleport_anchor, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "aun" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2899,6 +2902,13 @@ /obj/effect/turf_decal/trimline/secred/filled/line/lower, /turf/open/floor/plasteel, /area/security/brig) +"avd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "avj" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -2912,8 +2922,8 @@ /obj/docking_port/stationary{ dwidth = 8; height = 11; - shuttle_id = "auxiliary_construction"; name = "SS13: Auxiliary Construction Dock"; + shuttle_id = "auxiliary_construction"; width = 17 }, /turf/open/space/basic, @@ -4175,15 +4185,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/dorms) -"aDW" = ( -/obj/machinery/status_display/ai{ - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "aDX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -4971,9 +4972,9 @@ dir = 8; dwidth = 2; height = 5; - shuttle_id = "laborcamp_home"; name = "fore bay 1"; roundstart_template = /datum/map_template/shuttle/labour/box; + shuttle_id = "laborcamp_home"; width = 9 }, /turf/open/space/basic, @@ -4988,6 +4989,13 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) +"aKi" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/chair/office/light, +/turf/open/floor/plasteel/dark, +/area/science/server) "aKl" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -5190,6 +5198,9 @@ /obj/machinery/light{ dir = 1 }, +/obj/effect/turf_decal/siding/wood/thin{ + dir = 1 + }, /turf/open/floor/wood, /area/library) "aLh" = ( @@ -5736,6 +5747,7 @@ /obj/structure/cable{ icon_state = "0-4" }, +/obj/effect/turf_decal/siding/wood/corner/thin, /turf/open/floor/wood, /area/library) "aPd" = ( @@ -5767,24 +5779,21 @@ /area/crew_quarters/fitness) "aPf" = ( /obj/structure/railing, -/obj/effect/turf_decal/stripes, /obj/effect/turf_decal/ramp_middle, -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, /obj/effect/turf_decal/ramp_middle{ dir = 1 }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "aPg" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" }, -/turf/open/floor/engine/cult, +/turf/open/floor/plasteel/cult, /area/library) "aPi" = ( /obj/structure/table/wood, @@ -5793,7 +5802,7 @@ /obj/item/radio/intercom{ pixel_y = 25 }, -/turf/open/floor/engine/cult, +/turf/open/floor/plasteel/cult, /area/library) "aPm" = ( /obj/structure/chair/stool, @@ -5920,20 +5929,17 @@ /area/hallway/primary/port) "aPP" = ( /obj/structure/railing, -/obj/effect/turf_decal/stripes, /obj/effect/turf_decal/ramp_middle{ dir = 8 }, /obj/effect/turf_decal/ramp_middle, -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, /obj/effect/turf_decal/ramp_middle{ dir = 1 }, /obj/structure/cable{ icon_state = "1-8" }, +/obj/effect/turf_decal/siding/wood/thin, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -5962,21 +5968,25 @@ "aQr" = ( /obj/machinery/light/small, /obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/engine/cult, +/turf/open/floor/plasteel/cult, /area/library) "aQs" = ( /obj/structure/destructible/cult/tome, /obj/item/clothing/under/suit_jacket/red, /obj/item/book/codex_gigas, -/turf/open/floor/engine/cult, +/turf/open/floor/plasteel/cult, /area/library) "aQt" = ( /obj/effect/landmark/blobstart, /obj/structure/chair/comfy/brown{ dir = 1 }, -/turf/open/floor/engine/cult, +/turf/open/floor/plasteel/cult, /area/library) +"aQw" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "aQx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -6214,7 +6224,7 @@ dir = 1 }, /obj/machinery/door/firedoor/border_only, -/turf/open/floor/engine/cult, +/turf/open/floor/plasteel/cult, /area/library) "aRR" = ( /obj/machinery/camera{ @@ -6277,9 +6287,9 @@ dir = 8; dwidth = 4; height = 9; - shuttle_id = "aux_base_zone"; name = "aux base zone"; roundstart_template = /datum/map_template/shuttle/aux_base/default; + shuttle_id = "aux_base_zone"; width = 9 }, /turf/open/floor/plating, @@ -6502,6 +6512,23 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"aUc" = ( +/obj/machinery/flasher{ + id = "AI"; + pixel_x = 24; + pixel_y = -10 + }, +/obj/machinery/camera/motion{ + c_tag = "MiniSat Foyer"; + dir = 8; + network = list("minisat","ss13") + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "aUh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -6567,6 +6594,31 @@ /obj/structure/chair/office/dark, /turf/open/floor/wood, /area/library) +"aUK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + id_tag = "ai_core_airlock_exterior"; + name = "AI Core"; + req_access_txt = "65" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "aicoredoor"; + name = "AI Chamber entrance shutters" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/ai_monitored/turret_protected/ai) "aUL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 @@ -6907,13 +6959,10 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "aXX" = ( -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/ramp_middle, +/obj/effect/turf_decal/siding/wood/thin{ dir = 8 }, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/turf_decal/ramp_middle, /turf/open/floor/wood, /area/library) "aYd" = ( @@ -8008,17 +8057,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plating, /area/maintenance/starboard) -"bhL" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "bhM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -8047,7 +8085,7 @@ }, /obj/machinery/door/airlock/engineering/glass{ name = "Shared Engineering Storage"; - req_one_access_txt = "32;19;24" + req_one_access_txt = "10;32" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -8066,6 +8104,16 @@ "bhW" = ( /turf/closed/wall, /area/quartermaster/office) +"bhY" = ( +/obj/machinery/status_display/ai{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "bhZ" = ( /obj/effect/landmark/start/cargo_technician, /turf/open/floor/plasteel, @@ -8747,8 +8795,8 @@ "boS" = ( /obj/docking_port/stationary/random{ dir = 8; - shuttle_id = "pod_lavaland2"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland2" }, /turf/open/space, /area/space/nearstation) @@ -9427,24 +9475,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"buu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"buv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "buw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -10129,14 +10159,6 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/science/server) -"bAA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/science/server) "bAB" = ( /obj/machinery/door/airlock/command/glass{ name = "Server Room"; @@ -10162,16 +10184,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/server) -"bAD" = ( -/obj/structure/chair/office/light, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) "bAO" = ( /obj/vehicle/ridden/janicart, /obj/item/key/janitor, @@ -10383,10 +10395,10 @@ dir = 1; pixel_y = -26 }, -/obj/effect/turf_decal/siding/wood{ +/obj/machinery/papershredder, +/obj/effect/turf_decal/siding/wood/thin{ dir = 1 }, -/obj/machinery/papershredder, /turf/open/floor/wood, /area/library) "bBN" = ( @@ -10420,45 +10432,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/server) -"bBW" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 4; - pixel_y = 1 - }, -/obj/item/folder{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/pen{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/item/reagent_containers/food/drinks/britcup{ - desc = "This is a legendary cup. Some sources claim it was a trophy, won after a lengthy war over tables."; - name = "Medium Roast Premium coffee cup"; - pixel_x = 8; - pixel_y = 9 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) -"bBX" = ( -/obj/machinery/computer/rdservercontrol{ - dir = 1 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/server) "bCf" = ( /obj/machinery/airalarm{ dir = 8; @@ -10722,11 +10695,6 @@ "bEm" = ( /turf/open/floor/engine, /area/science/xenobiology) -"bEo" = ( -/obj/machinery/portable_atmospherics/canister/toxins, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/science/storage) "bEs" = ( /turf/closed/wall, /area/science/mixing) @@ -10776,7 +10744,6 @@ /area/science/mixing) "bFb" = ( /obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood, /obj/item/deskbell/preset/library{ pixel_x = -9; pixel_y = -3 @@ -10792,6 +10759,7 @@ /obj/item/storage/pencil_holder/crew{ pixel_x = 8 }, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "bFr" = ( @@ -11287,22 +11255,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) -"bKB" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "bKG" = ( /obj/machinery/requests_console{ department = "EVA"; @@ -11629,6 +11581,15 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"bMO" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "bMQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 8 @@ -11732,7 +11693,7 @@ pixel_x = 1; pixel_y = 5 }, -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/siding/wood/thin{ dir = 1 }, /turf/open/floor/wood, @@ -12240,23 +12201,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/virology) -"bRR" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/research/glass{ - name = "Secondary AI Core"; - normalspeed = 0; - req_access_txt = "47" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "bSh" = ( /obj/item/radio/intercom{ dir = 4; @@ -12271,19 +12215,6 @@ }, /turf/open/floor/plasteel, /area/security/prison/hallway) -"bSm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/starboard/aft) "bSC" = ( /obj/machinery/portable_atmospherics/canister/water_vapor, /obj/structure/window/reinforced{ @@ -12297,25 +12228,6 @@ /obj/effect/turf_decal/trimline/blue, /turf/open/floor/plasteel/dark, /area/engine/atmos/foyer) -"bSJ" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Antechamber"; - req_access_txt = "65" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "bSN" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -12404,6 +12316,15 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/eva) +"bTL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "bUh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -12596,6 +12517,15 @@ /mob/living/simple_animal/slime, /turf/open/floor/engine, /area/science/xenobiology) +"bXk" = ( +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "bXp" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -12696,30 +12626,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"bYF" = ( -/obj/machinery/button/door{ - id = "misclab"; - name = "Test Chamber Blast Doors"; - pixel_x = -13; - pixel_y = 6; - req_access_txt = "55" - }, -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -4 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/xenobiology) "bYI" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -12767,11 +12673,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 4 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24; - pixel_y = 1 - }, /turf/open/floor/plasteel, /area/hallway/primary/aft_starboard) "bZI" = ( @@ -12836,14 +12737,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/prison) -"car" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "caI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -12859,6 +12752,16 @@ }, /turf/open/floor/plating, /area/security/prison) +"caL" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-4" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/obj/machinery/light, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "caR" = ( /obj/structure/table, /obj/item/stack/cable_coil{ @@ -13175,10 +13078,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"ceR" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "ceW" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/techstorage/RnD_secure, @@ -13242,9 +13141,9 @@ dir = 8; dwidth = 3; height = 15; - shuttle_id = "arrivals_stationary"; name = "arrivals"; roundstart_template = /datum/map_template/shuttle/arrival/box; + shuttle_id = "arrivals_stationary"; width = 7 }, /turf/open/space/basic, @@ -13568,6 +13467,16 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"ckf" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/machinery/camera/motion/armory{ + c_tag = "Armory North" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "ckw" = ( /obj/structure/cable{ icon_state = "2-8" @@ -14347,6 +14256,30 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) +"csa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) +"csi" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/storage/satellite) "csl" = ( /obj/machinery/vending/cola/random, /turf/open/floor/plasteel/dark, @@ -14402,6 +14335,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "ctu" = ( @@ -14624,6 +14558,19 @@ }, /turf/open/floor/plasteel, /area/engine/engine_smes) +"cvU" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plating, +/area/ai_monitored/storage/satellite) "cvV" = ( /obj/machinery/door/airlock/external{ name = "MiniSat External Access"; @@ -14648,13 +14595,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"cwf" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "cwH" = ( /obj/structure/grille/broken, /turf/open/floor/plating, @@ -14901,17 +14841,6 @@ }, /turf/open/floor/plasteel, /area/vacant_room/commissary) -"cAP" = ( -/obj/structure/table, -/obj/item/electropack, -/obj/item/healthanalyzer, -/obj/item/assembly/signaler, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/misc_lab) "cAR" = ( /obj/effect/turf_decal/box, /obj/machinery/firealarm{ @@ -15544,6 +15473,7 @@ pixel_x = -4; pixel_y = 8 }, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/library) "cKH" = ( @@ -15742,6 +15672,18 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel/white, /area/medical/genetics) +"cNi" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "cNy" = ( /obj/machinery/air_sensor{ id_tag = "co2_sensor" @@ -15803,7 +15745,7 @@ /area/maintenance/starboard/aft) "cOh" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -26 }, /turf/open/floor/plasteel, @@ -16003,6 +15945,18 @@ /obj/item/stock_parts/subspace/amplifier, /turf/open/floor/plasteel/white, /area/storage/tech) +"cRc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cRi" = ( /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -16210,6 +16164,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"cUl" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "cUm" = ( /obj/structure/sign/departments/minsky/security/security, /turf/closed/wall, @@ -16366,15 +16328,6 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"cWY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "cXg" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -16450,7 +16403,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "cZY" = ( -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/siding/wood/thin{ dir = 1 }, /turf/open/floor/wood, @@ -16583,26 +16536,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/bridge) -"dbB" = ( -/obj/machinery/door/window/southleft{ - name = "Test Chamber"; - req_access_txt = "55" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/xenobiology) "dbJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/sign/plaques/ai_password{ - pixel_x = 32 - }, /obj/machinery/papershredder, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) @@ -16644,6 +16581,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"ddk" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "ddA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16693,6 +16639,18 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) +"deQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/turf/open/floor/plasteel, +/area/science/misc_lab) "dfb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 @@ -16979,7 +16937,7 @@ pixel_y = 9 }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -26 }, /obj/effect/turf_decal/trimline/brown/filled/line/lower{ @@ -17119,12 +17077,6 @@ /obj/machinery/rack_creator, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) -"dnj" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "dno" = ( /obj/machinery/requests_console{ announcementConsole = 1; @@ -17476,9 +17428,6 @@ /turf/open/floor/plasteel/white, /area/medical/surgery) "dvd" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/effect/turf_decal/ramp_corner{ dir = 4 }, @@ -17864,13 +17813,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) -"dBH" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "dBV" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/wood, @@ -17916,6 +17858,20 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/plasteel/dark, /area/security/prison) +"dCT" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "dDm" = ( /obj/effect/landmark/observer_start, /obj/effect/turf_decal/plaque{ @@ -17967,22 +17923,6 @@ "dEb" = ( /turf/closed/wall, /area/crew_quarters/heads/hop) -"dEd" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Monitoring Room"; - req_access_txt = "65" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "dEw" = ( /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 4 @@ -18302,7 +18242,7 @@ "dKN" = ( /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "10;13" + req_access_txt = "10" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ dirx = -2; @@ -18362,6 +18302,25 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) +"dMr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/turf/open/floor/plasteel/white, +/area/science/research) "dMA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -18470,7 +18429,7 @@ /area/hallway/secondary/entry) "dOm" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -26 }, /obj/machinery/door/firedoor/border_only{ @@ -18492,15 +18451,6 @@ /obj/machinery/porta_turret/ai, /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) -"dOp" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 8 - }, -/obj/structure/cable/white{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "dOt" = ( /obj/machinery/vending/wardrobe/medi_wardrobe, /obj/machinery/light, @@ -18565,9 +18515,6 @@ /turf/open/floor/stone, /area/crew_quarters/bar) "dPy" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/structure/sign/painting{ persistence_id = "public"; pixel_x = -32 @@ -18576,6 +18523,9 @@ c_tag = "Library East"; dir = 4 }, +/obj/effect/turf_decal/siding/wood/corner/thin{ + dir = 4 + }, /turf/open/floor/wood, /area/library) "dPP" = ( @@ -18770,20 +18720,6 @@ /obj/machinery/vending/robotics, /turf/open/floor/plasteel, /area/science/robotics/lab) -"dTb" = ( -/obj/machinery/holopad, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "dTe" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/machinery/airalarm{ @@ -18832,9 +18768,6 @@ /turf/open/floor/circuit/telecomms/server, /area/ai_monitored/turret_protected/ai) "dUl" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, @@ -18844,6 +18777,10 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/arrows/white{ + color = "#99ccff"; + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dUD" = ( @@ -18912,14 +18849,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"dVK" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/machinery/camera/motion/armory, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) "dVM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -18995,15 +18924,6 @@ }, /turf/open/floor/plasteel, /area/security/main) -"dXn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "dXw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/electricshock, @@ -19589,7 +19509,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 5 }, /turf/open/floor/plasteel/dark, @@ -20090,6 +20010,18 @@ }, /turf/open/floor/plasteel/freezer, /area/security/prison) +"etp" = ( +/obj/machinery/door/airlock/command/glass{ + id_tag = "secondary_aicore_exterior"; + name = "Physical Core Access"; + req_one_access_txt = "30;70" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "etv" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input{ dir = 4 @@ -20401,6 +20333,25 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/wood, /area/library) +"exA" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "MiniSat Maintenance"; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/storage/satellite) "exB" = ( /obj/structure/chair/office/dark{ dir = 4 @@ -20697,6 +20648,10 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/engine, /area/science/xenobiology) +"eDh" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/hidden, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "eDG" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 8 @@ -20937,6 +20892,12 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/atmos/mix) +"eGL" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "eGN" = ( /obj/structure/sign/warning/electricshock{ pixel_y = 32 @@ -21193,6 +21154,15 @@ }, /turf/open/floor/plasteel, /area/security/main) +"eLI" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "eLV" = ( /obj/structure/grille/broken, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -21249,6 +21219,18 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) +"eMz" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/machinery/cell_charger{ + pixel_y = 5 + }, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil, +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/turf/open/floor/plasteel, +/area/science/misc_lab) "eMG" = ( /obj/machinery/light, /obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower, @@ -21312,6 +21294,13 @@ }, /turf/open/space/basic, /area/solar/port/fore) +"eNr" = ( +/obj/machinery/computer/ai_overclocking, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "eNw" = ( /obj/machinery/airalarm{ dir = 8; @@ -21568,6 +21557,18 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"eSt" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/departments/minsky/command/charge{ + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "eSP" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 8 @@ -21838,6 +21839,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"eWI" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "eWN" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/machinery/atmospherics/miner/n2o, @@ -22038,6 +22043,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/sleeper) "eZD" = ( @@ -22195,7 +22201,6 @@ /obj/structure/sign/plaques/cave{ pixel_y = 32 }, -/obj/item/circuitboard/computer/ai_upload_download, /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "fen" = ( @@ -22314,6 +22319,9 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"ffJ" = ( +/turf/open/floor/plasteel/dark, +/area/science/server) "fgc" = ( /turf/closed/wall, /area/crew_quarters/kitchen) @@ -22374,6 +22382,37 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"fhu" = ( +/obj/machinery/button/door{ + id = "misclab"; + name = "Test Chamber Blast Doors"; + pixel_x = -13; + pixel_y = 6; + req_access_txt = "55" + }, +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/paper_bin{ + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -4 + }, +/obj/machinery/button/door{ + id = "misclab"; + name = "Test Chamber Blast Doors"; + pixel_x = -13; + pixel_y = 6; + req_access_txt = "55" + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "fhF" = ( /obj/structure/closet/crate, /obj/item/stack/license_plates/empty/fifty, @@ -22400,8 +22439,8 @@ "fhN" = ( /obj/docking_port/stationary/random{ dir = 8; - shuttle_id = "pod_lavaland1"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland1" }, /turf/open/space, /area/space/nearstation) @@ -22535,6 +22574,9 @@ /area/engine/atmos/storage) "fjN" = ( /obj/effect/landmark/start/cyborg, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "fjZ" = ( @@ -22573,6 +22615,10 @@ /obj/effect/turf_decal/trimline/brown/filled/corner/lower, /turf/open/floor/plasteel, /area/quartermaster/office) +"fkf" = ( +/obj/item/ai_cpu, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "fkk" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22615,6 +22661,18 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) +"fkO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "flm" = ( /obj/machinery/camera{ c_tag = "Toxins Lab West"; @@ -22787,22 +22845,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/interrogation) -"fnK" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -24 - }, -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "fnX" = ( /obj/machinery/vending/wardrobe/gene_wardrobe, /obj/effect/turf_decal/trimline/purple/filled/line/lower{ @@ -23003,7 +23045,7 @@ }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "25;26;35;28;46;37;38" + req_access_txt = "79" }, /obj/structure/cable{ icon_state = "1-2" @@ -23771,18 +23813,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"fFO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/computer/ai_resource_distribution{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "fFS" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor/border_only{ @@ -23852,7 +23882,7 @@ "fHf" = ( /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ dirx = 2; @@ -23890,6 +23920,20 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"fIa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/mapping_helpers/teleport_anchor, +/obj/structure/chair/stool, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "fIc" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/power/apc{ @@ -23953,13 +23997,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft_starboard) -"fIH" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "fIS" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -24057,6 +24094,14 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"fJX" = ( +/obj/item/stack/cable_coil, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "fJY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/vending/cigarette, @@ -24117,31 +24162,6 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"fKM" = ( -/obj/machinery/door/airlock/command/glass{ - id_tag = "secondary_aicore_interior"; - name = "Physical Core Access"; - req_one_access_txt = "30, 70" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ - dirx = -1; - diry = -1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ai_monitored/secondarydatacore) "fKR" = ( /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) @@ -24775,25 +24795,14 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"fYE" = ( +"fYx" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "MiniSat Maintenance"; - req_access_txt = "65" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/storage/satellite) +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "fYZ" = ( /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 8 @@ -25081,6 +25090,18 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"gcS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "gdE" = ( /obj/machinery/door/poddoor/shutters{ id = "phoenixwright"; @@ -25108,12 +25129,6 @@ }, /turf/open/floor/wood, /area/library) -"gdI" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "gdU" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -25256,6 +25271,12 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) +"ggA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/closed/wall, +/area/maintenance/starboard/aft) "ggC" = ( /obj/effect/turf_decal/trimline/purple/filled/line/lower, /turf/open/floor/plasteel/white, @@ -25426,31 +25447,6 @@ /obj/effect/spawner/structure/window/reinforced/shutter, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"gka" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/airlock/highsecurity{ - id_tag = "ai_core_airlock_interior"; - name = "AI Core"; - req_access_txt = "65" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aicoredoor"; - name = "AI Chamber entrance shutters" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "gkA" = ( /obj/effect/landmark/start/medical_doctor, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -25563,23 +25559,10 @@ /turf/open/floor/plating, /area/maintenance/aft) "gon" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/atmospherics/miner/toxins, /turf/open/floor/engine/plasma, /area/engine/atmos/distro) -"goW" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/power/apc/highcap{ - areastring = "/area/ai_monitored/secondarydatacore"; - dir = 4; - name = "AI Secondary Datacore"; - pixel_x = 24 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "goZ" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, @@ -25647,6 +25630,26 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"gqI" = ( +/obj/machinery/door/airlock/command/glass{ + id_tag = "secondary_aicore_interior"; + name = "Physical Core Access"; + req_one_access_txt = "30;70" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/secondarydatacore) "gqO" = ( /obj/structure/chair{ dir = 8 @@ -25695,15 +25698,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plasteel, /area/security/prison/hallway) -"grq" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "gru" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 @@ -25761,6 +25755,15 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"gtd" = ( +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "gtj" = ( /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 @@ -25770,6 +25773,19 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) +"gtk" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/landmark/start/yogs/network_admin, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "gtn" = ( /obj/structure/cable{ icon_state = "1-2" @@ -25947,18 +25963,6 @@ }, /turf/open/floor/engine, /area/science/misc_lab) -"gvV" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/multitool, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/item/stock_parts/cell/high/plus, -/obj/item/stack/cable_coil, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, -/turf/open/floor/plasteel, -/area/science/misc_lab) "gws" = ( /obj/machinery/airalarm{ pixel_y = 24 @@ -26086,6 +26090,18 @@ /obj/structure/closet/secure_closet/medical3, /turf/open/floor/plasteel/white, /area/medical/storage) +"gzq" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/item/radio/intercom{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "gzz" = ( /obj/item/pool/rubber_ring, /turf/open/indestructible/sound/pool, @@ -26146,6 +26162,13 @@ /obj/item/reagent_containers/food/condiment/enzyme{ layer = 5 }, +/obj/machinery/button/door{ + id = "kitchen"; + name = "Counter Shutters Control"; + pixel_x = -27; + pixel_y = -5; + req_access_txt = "28" + }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "gAq" = ( @@ -26257,22 +26280,6 @@ /obj/structure/chair/stool, /turf/open/floor/plasteel/dark/corner, /area/security/prison) -"gDs" = ( -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_interior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -24; - pixel_y = 8; - req_one_access_txt = "30;70" - }, -/obj/structure/chair/office/light, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "gDD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -26354,15 +26361,6 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab) -"gFg" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "gFF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -26463,6 +26461,19 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"gHh" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/computer/rdservercontrol{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) "gHl" = ( /obj/machinery/light/small{ dir = 4 @@ -26587,6 +26598,32 @@ /obj/item/flashlight/lamp, /turf/open/floor/wood, /area/vacant_room) +"gIX" = ( +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/folder{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/pen{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/drinks/britcup{ + desc = "This is a legendary cup. Some sources claim it was a trophy, won after a lengthy war over tables."; + name = "Medium Roast Premium coffee cup"; + pixel_x = 8; + pixel_y = 9 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) "gJh" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, @@ -26675,10 +26712,6 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/storage) -"gLN" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "gLV" = ( /obj/machinery/camera{ c_tag = "Fore Primary Hallway Central"; @@ -26747,13 +26780,6 @@ /turf/open/floor/plasteel/white, /area/science/explab) "gOa" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/turf_decal/ramp_middle, /obj/effect/turf_decal/ramp_middle, /obj/structure/bookcase/random/fiction, /turf/open/floor/carpet, @@ -26927,6 +26953,24 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/bridge) +"gRw" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + external_pressure_bound = 120; + name = "server vent" + }, +/obj/structure/cable/white, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "gRH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -27106,8 +27150,8 @@ /turf/open/floor/plasteel, /area/security/prison) "gTa" = ( -/obj/effect/turf_decal/siding/wood, /obj/machinery/photocopier, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "gTb" = ( @@ -27249,6 +27293,18 @@ }, /turf/open/floor/plasteel, /area/security/prison/hallway) +"gVq" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "gVy" = ( /obj/effect/turf_decal/siding/wood/thin, /obj/machinery/camera{ @@ -27414,10 +27470,6 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/stripes{ - dir = 9 - }, -/obj/effect/turf_decal/ramp_middle, /obj/effect/turf_decal/ramp_middle{ dir = 4 }, @@ -27457,10 +27509,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, /turf/open/floor/plasteel/white, /area/science/research) "gZq" = ( @@ -27654,6 +27706,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "hcE" = ( @@ -27727,8 +27780,8 @@ dir = 8; dwidth = 2; height = 13; - shuttle_id = "ferry_home"; name = "port bay 2"; + shuttle_id = "ferry_home"; width = 5 }, /turf/open/space/basic, @@ -27780,6 +27833,23 @@ "hfr" = ( /turf/closed/wall/r_wall, /area/space/nearstation) +"hft" = ( +/obj/machinery/door/airlock/command{ + name = "Server Room"; + req_access_txt = "30" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/server) "hfu" = ( /obj/machinery/power/apc{ areastring = "/area/ai_monitored/turret_protected/ai_upload_foyer"; @@ -27919,6 +27989,13 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel/dark, /area/security/detectives_office) +"hhB" = ( +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/obj/machinery/ai/server_cabinet, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hhC" = ( /obj/machinery/advanced_airlock_controller{ dir = 1; @@ -28336,7 +28413,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/white, /area/science/research) "hpZ" = ( @@ -28351,7 +28428,9 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "hqu" = ( @@ -28384,6 +28463,18 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"hqM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8; + external_pressure_bound = 140; + plane = -2; + pressure_checks = 0 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hqQ" = ( /obj/machinery/shower{ dir = 8; @@ -28507,6 +28598,11 @@ /obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 4 }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24; + pixel_y = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft_starboard) "hsq" = ( @@ -28561,6 +28657,16 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) +"hsK" = ( +/obj/structure/closet/crate/secure/gear/donut, +/obj/item/reagent_containers/food/snacks/donut, +/obj/item/paper/guides/jobs/security/donut, +/obj/machinery/camera/motion/armory{ + c_tag = "Armory South"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/security/armory) "hsL" = ( /obj/structure/table/glass, /obj/item/clothing/glasses/science, @@ -28731,6 +28837,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"hwy" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "hwD" = ( /obj/machinery/camera{ c_tag = "SMES External"; @@ -29426,7 +29538,7 @@ /area/quartermaster/warehouse) "hIV" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -26 }, /obj/effect/turf_decal/stripes/corner{ @@ -29724,15 +29836,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"hOU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/computer/ai_server_console{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "hPv" = ( /obj/machinery/light{ dir = 4 @@ -29891,6 +29994,12 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"hRd" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hRi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -29910,8 +30019,12 @@ /turf/open/floor/plasteel, /area/engine/atmos/mix) "hRt" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, /obj/effect/landmark/xeno_spawn, -/turf/open/floor/wood/parquet, +/turf/open/floor/plasteel, /area/crew_quarters/bar) "hRx" = ( /obj/effect/turf_decal/tile/red/opposingcorners, @@ -29993,6 +30106,14 @@ }, /turf/open/floor/plating, /area/security/warden) +"hSP" = ( +/obj/machinery/camera{ + c_tag = "Secondary AI Core - Server Room"; + dir = 8; + network = list("ss13","rd") + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "hTo" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -30393,29 +30514,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"hYX" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/computer/monitor{ - dir = 1; - name = "MiniSat power monitoring console" - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) -"hYY" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "hZg" = ( /obj/machinery/power/smes/engineering{ charge = 5e+006; @@ -30509,6 +30607,12 @@ /obj/effect/landmark/stationroom/box/hydroponics, /turf/template_noop, /area/hydroponics) +"iat" = ( +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "ibh" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -30623,6 +30727,21 @@ /obj/item/pen, /turf/open/floor/plasteel, /area/engine/foyer) +"icd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "ice" = ( /obj/machinery/light/small{ dir = 4 @@ -30679,13 +30798,13 @@ /turf/open/floor/carpet, /area/library) "idH" = ( -/obj/effect/turf_decal/siding/wood, /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen{ pixel_x = 4; pixel_y = 2 }, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "idL" = ( @@ -30759,20 +30878,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"ief" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - external_pressure_bound = 120 - }, -/obj/machinery/airalarm/tcomms{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "ieh" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -30783,19 +30888,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"iek" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Teleporter Room"; - req_one_access_txt = "17;65" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "ien" = ( /obj/machinery/computer/security/telescreen/vault{ pixel_y = 30 @@ -30947,12 +31039,6 @@ /obj/machinery/vending/coffee, /turf/open/floor/plasteel, /area/security/prison/hallway) -"ihg" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/turf/open/floor/wood, -/area/library) "ihn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -31000,10 +31086,6 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) -"iiJ" = ( -/obj/machinery/ai/server_cabinet, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/ai_monitored/secondarydatacore) "iiO" = ( /obj/machinery/gulag_item_reclaimer{ pixel_y = 24 @@ -31089,14 +31171,26 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos/mix) -"ikV" = ( -/obj/machinery/ai/server_cabinet/prefilled, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) +"ikM" = ( +/obj/structure/table, +/obj/item/paper/crumpled/bloody{ + info = "What they're doing to those people... It's... It's barbaric... S.E.L.F. must be made aware." + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "ilc" = ( /obj/effect/turf_decal/trimline/brown/filled/corner/lower, /turf/open/floor/plasteel, /area/quartermaster/office) +"ild" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "ilm" = ( /obj/structure/sink{ dir = 4; @@ -31440,6 +31534,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"iqf" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "iqi" = ( /obj/machinery/keycard_auth{ pixel_x = 24 @@ -31593,6 +31693,11 @@ }, /turf/open/floor/wood, /area/bridge/meeting_room) +"irR" = ( +/obj/structure/lattice, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) "irT" = ( /obj/effect/spawner/lootdrop/mob/kitchen_animal, /obj/structure/cable{ @@ -31737,6 +31842,16 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) +"ivv" = ( +/obj/machinery/ai/networking{ + label = "Computer Science"; + roundstart_connection = "Main Core" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "ivE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31761,6 +31876,14 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) +"ivX" = ( +/obj/structure/table/wood, +/obj/item/radio/off{ + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "iwj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 10 @@ -31812,6 +31935,25 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"ixP" = ( +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "test chamber blast door" + }, +/obj/machinery/door/airlock/research/glass{ + name = "Test Chamber"; + req_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/engine, +/area/science/misc_lab) "ixV" = ( /obj/structure/table/wood, /obj/machinery/photocopier/faxmachine{ @@ -32096,19 +32238,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/main) -"iDE" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/ai_monitored/storage/satellite) "iDQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -32158,6 +32287,15 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) +"iEk" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "iEt" = ( /turf/open/floor/plasteel, /area/escapepodbay) @@ -32319,6 +32457,10 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"iHA" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/server) "iHI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -32422,6 +32564,29 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"iJJ" = ( +/obj/machinery/power/apc/highcap{ + areastring = "/area/ai_monitored/secondarydatacore"; + dir = 4; + name = "AI Secondary Datacore"; + pixel_x = 24 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Secondary AI Core"; + dir = 8; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "iJL" = ( /obj/structure/rack, /obj/item/tank/internals/emergency_oxygen, @@ -32602,6 +32767,7 @@ /obj/machinery/bookbinder{ pixel_y = 8 }, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/library) "iMC" = ( @@ -32724,6 +32890,24 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"iNV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/bridge) "iNY" = ( /obj/effect/turf_decal/ramp_middle{ dir = 1 @@ -32736,6 +32920,17 @@ /obj/structure/spacepoddoor, /turf/open/floor/engine/airless, /area/escapepodbay) +"iOb" = ( +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "iOB" = ( /obj/machinery/power/apc{ areastring = "/area/medical/chemistry"; @@ -33097,10 +33292,6 @@ }, /turf/open/floor/plating, /area/medical/paramedic) -"iVk" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "iVn" = ( /obj/structure/closet/crate{ icon_state = "crateopen" @@ -33330,6 +33521,13 @@ }, /turf/open/floor/plasteel/freezer, /area/security/prison) +"iZA" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/secondarydatacore) "iZJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -33486,12 +33684,17 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"jcz" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 1 +"jcv" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) +/obj/machinery/computer/message_monitor{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "jcF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ @@ -33588,6 +33791,21 @@ }, /turf/open/floor/plasteel, /area/security/prison/hallway) +"jeM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "jeO" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -33881,21 +34099,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"jkJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/bridge) "jld" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/techstorage/rnd, @@ -34102,7 +34305,7 @@ "joA" = ( /obj/machinery/door/window/brigdoor/westleft{ name = "AI Satellite Access"; - req_one_access_txt = "32;19" + req_access_txt = "65" }, /turf/open/floor/plasteel/dark, /area/engine/engineering) @@ -34161,6 +34364,21 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"joY" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "jpb" = ( /obj/structure/sign/warning/deathsposal{ pixel_y = -32 @@ -34202,6 +34420,39 @@ }, /turf/open/floor/plating/airless, /area/security/prison) +"jpK" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/highsecurity{ + id_tag = "ai_core_airlock_exterior"; + name = "AI Core"; + req_access_txt = "65" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/ai) "jpL" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, @@ -34214,9 +34465,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "jpO" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff" - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 4 }, @@ -34491,6 +34739,16 @@ icon_state = "platingdmg3" }, /area/maintenance/port) +"juj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "juo" = ( /obj/structure/closet/crate/freezer, /obj/effect/decal/cleanable/dirt, @@ -34631,12 +34889,6 @@ }, /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) -"jzm" = ( -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "jzo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 @@ -34723,6 +34975,14 @@ "jAS" = ( /turf/closed/wall, /area/security/interrogation) +"jBD" = ( +/obj/machinery/airalarm/tcomms{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "jBJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -34880,20 +35140,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/atmos/distro) -"jEd" = ( -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "jEn" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall, @@ -35135,10 +35381,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "jIq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/effect/turf_decal/siding/wood/thin{ + dir = 10 }, -/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/library) "jIJ" = ( @@ -35222,48 +35467,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"jKN" = ( -/obj/machinery/ai/data_core/primary, -/obj/machinery/power/apc/highcap{ - dir = 8; - name = "AI Chamber APC"; - pixel_x = -25 - }, -/obj/structure/cable/white{ - icon_state = "0-4" - }, -/obj/item/radio/intercom{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_y = -27 - }, -/obj/item/radio/intercom{ - freerange = 1; - frequency = 1447; - name = "Private Channel"; - pixel_y = 20 - }, -/obj/item/radio/intercom{ - freerange = 1; - name = "Common Channel"; - pixel_y = -37 - }, -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = -1; - pixel_y = 38 - }, -/obj/machinery/button/door{ - id = "aicoredoor"; - name = "AI Chamber entrance shutters control"; - pixel_x = -23; - pixel_y = 21; - req_access_txt = "16" - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "jKZ" = ( /obj/effect/landmark/start/atmospheric_technician, /obj/structure/chair/office/dark{ @@ -35395,6 +35598,13 @@ /obj/effect/turf_decal/trimline/purple/warning/lower, /turf/open/floor/plasteel/white, /area/science/robotics/lab) +"jOq" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "jOv" = ( /obj/effect/landmark/event_spawn, /obj/structure/chair/comfy/brown{ @@ -35459,20 +35669,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/science/research) -"jPU" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "jQg" = ( /obj/effect/turf_decal/arrows/white{ color = "#99ccff"; @@ -35880,15 +36076,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) -"jXZ" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "jYd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -35978,6 +36165,20 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"kaw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "kaA" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/table, @@ -36217,6 +36418,14 @@ }, /turf/open/floor/plasteel, /area/engine/foyer) +"khi" = ( +/obj/structure/table, +/obj/machinery/compsci_reciever, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "khj" = ( /obj/machinery/washing_machine, /obj/machinery/light, @@ -36226,8 +36435,8 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/locker) "khm" = ( -/obj/effect/turf_decal/stripes, /obj/structure/railing/corner, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "khy" = ( @@ -36300,6 +36509,21 @@ }, /turf/open/floor/plasteel, /area/quartermaster/warehouse) +"kig" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "kik" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -36528,15 +36752,9 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"kmj" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) +"kmo" = ( +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "kmp" = ( /obj/machinery/power/apc{ areastring = "/area/teleporter"; @@ -36667,6 +36885,13 @@ }, /turf/open/space/basic, /area/ai_monitored/turret_protected/ai) +"koE" = ( +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/obj/machinery/ai/server_cabinet/prefilled, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "kpp" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 1 @@ -36861,7 +37086,7 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -26 }, /turf/open/floor/plasteel, @@ -37030,6 +37255,21 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"kxW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "kyl" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -37081,10 +37321,10 @@ /obj/effect/landmark/start/lawyer, /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; + dir = 1; name = "Prison Monitor"; network = list("prison"); - pixel_y = -26; - dir = 1 + pixel_y = -26 }, /turf/open/floor/wood, /area/lawoffice) @@ -37314,6 +37554,13 @@ /obj/item/wrench, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"kCD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) "kCI" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=8"; @@ -37455,6 +37702,21 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"kEH" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = -32 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "kEL" = ( /obj/machinery/conveyor{ dir = 4; @@ -37586,6 +37848,15 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"kIr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/research) "kIO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37632,12 +37903,6 @@ }, /turf/open/floor/carpet, /area/crew_quarters/fitness) -"kJz" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "kKq" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -37646,7 +37911,7 @@ }, /obj/item/pen/invisible, /obj/item/toy/figure/curator, -/turf/open/floor/engine/cult, +/turf/open/floor/plasteel/cult, /area/library) "kKK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -38068,8 +38333,8 @@ /area/bridge/meeting_room) "kRG" = ( /obj/item/kirbyplants/photosynthetic, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 10 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -38086,14 +38351,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /turf/open/floor/plasteel, /area/security/processing) -"kRZ" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6; - layer = 2.35; - - }, -/turf/closed/wall, -/area/science/mixing) "kSb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plasteel, @@ -38173,6 +38430,13 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"kTH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "kTM" = ( /obj/structure/window/reinforced{ dir = 4 @@ -38491,13 +38755,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel/showroomfloor, /area/security/main) -"lbE" = ( -/obj/machinery/light, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "lbH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -38538,23 +38795,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/cmo) -"lcM" = ( -/obj/machinery/door/airlock/command{ - name = "Server Room"; - req_access_txt = "30" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/science/server) "ldU" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hop"; @@ -38706,7 +38946,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/white, /area/science/research) "lfM" = ( @@ -38758,6 +38998,21 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"lgr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "lgK" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/sign/departments/minsky/engineering/atmospherics{ @@ -38770,24 +39025,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"lgN" = ( -/obj/structure/railing, -/obj/effect/turf_decal/stripes, -/obj/effect/turf_decal/ramp_middle, -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, -/obj/effect/turf_decal/ramp_middle{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/wood, -/area/library) "lhk" = ( /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) @@ -38973,6 +39210,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/white, /area/medical/storage) +"ljG" = ( +/obj/structure/cable/white, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "ljN" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -39145,12 +39386,6 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/locker) "llW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 5 - }, /obj/item/kirbyplants/random{ pixel_x = -5 }, @@ -39190,6 +39425,17 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"lmE" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "lmI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -39333,18 +39579,6 @@ /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit/green/telecomms/mainframe, /area/tcommsat/server) -"loK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/turf/open/floor/plasteel, -/area/science/misc_lab) "loR" = ( /obj/structure/lattice, /turf/closed/wall/r_wall, @@ -39389,6 +39623,17 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/plasteel/white, /area/storage/tech) +"lqv" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = 8; + pixel_y = -23 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "lqw" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box{ @@ -39596,6 +39841,19 @@ /obj/structure/cable, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) +"lvD" = ( +/obj/machinery/door/window/southleft{ + name = "Test Chamber"; + req_access_txt = "55" + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "lvP" = ( /obj/machinery/airalarm{ pixel_y = 24 @@ -39710,15 +39968,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"lxF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "lxP" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/yellow, @@ -39980,7 +40229,7 @@ pixel_x = -6; pixel_y = 3 }, -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/siding/wood/thin{ dir = 1 }, /turf/open/floor/wood, @@ -40121,6 +40370,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"lHg" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "lHi" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/trimline/engiyellow/filled/corner/lower{ @@ -40144,11 +40402,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/crew_quarters/heads/captain) -"lHO" = ( -/obj/item/stack/cable_coil, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "lIb" = ( /obj/structure/sign/warning/electricshock{ pixel_y = 32 @@ -40296,10 +40549,6 @@ /turf/open/floor/plasteel, /area/security/brig) "lLT" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff"; - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, @@ -40309,6 +40558,10 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/arrows/white{ + color = "#99ccff"; + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "lLX" = ( @@ -40543,6 +40796,18 @@ }, /turf/open/floor/plasteel/white, /area/science/explab) +"lPr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "lPH" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, @@ -40576,21 +40841,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/cafeteria, /area/security/prison) -"lQv" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "lQB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -40855,6 +41105,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"lXw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "lXG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -41038,19 +41297,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/disposal) -"lZD" = ( -/obj/structure/table/wood, -/obj/item/radio/off{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/folder{ - pixel_x = 6; - pixel_y = 2 - }, -/obj/item/disk/holodisk/tutorial/AICore, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "lZH" = ( /obj/item/kirbyplants/random, /obj/machinery/light/small{ @@ -41073,9 +41319,6 @@ /obj/structure/chair/office/dark{ dir = 1 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, /obj/effect/turf_decal/ramp_corner{ dir = 8 }, @@ -41179,6 +41422,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"mcR" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "mcT" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/stripes/line, @@ -41336,6 +41588,18 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/theatre) +"mfs" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "mfz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -41562,6 +41826,21 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"mjZ" = ( +/obj/machinery/camera{ + c_tag = "AI Chamber - Port"; + dir = 4; + network = list("aicore") + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "mkg" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -41780,7 +42059,7 @@ /area/security/prison) "mnR" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -26 }, /obj/effect/turf_decal/trimline/blue/filled/line/lower{ @@ -42186,18 +42465,6 @@ /obj/effect/turf_decal/trimline/green/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/virology) -"mtW" = ( -/obj/machinery/computer/security/telescreen{ - dir = 8; - name = "MiniSat Camera Monitor"; - network = list("minisat","aicore"); - pixel_x = 26 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "mtZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -42280,26 +42547,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) -"mwf" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_exterior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -23; - pixel_y = -9; - req_one_access_txt = "30;70" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "mwF" = ( /turf/open/floor/plasteel/white, /area/medical/chemistry) @@ -42324,8 +42571,8 @@ dir = 2; dwidth = 11; height = 22; - shuttle_id = "whiteship_home"; name = "SS13: Auxiliary Dock, Station-Port"; + shuttle_id = "whiteship_home"; width = 35 }, /turf/open/space/basic, @@ -42334,27 +42581,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/crew_quarters/cryopods) -"mxQ" = ( -/obj/machinery/flasher{ - id = "AI"; - pixel_x = 25; - pixel_y = 6 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "ai_core_airlock_interior"; - idSelf = "ai_core_airlock_control"; - pixel_x = 23; - pixel_y = -7 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "mxS" = ( /obj/structure/sign/warning/vacuum{ pixel_x = -32 @@ -42447,6 +42673,27 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"mAe" = ( +/obj/machinery/flasher{ + id = "AI"; + pixel_x = 25; + pixel_y = 6 + }, +/obj/machinery/doorButtons/access_button{ + idDoor = "ai_core_airlock_interior"; + idSelf = "ai_core_airlock_control"; + pixel_x = 23; + pixel_y = -7 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "mAl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -42616,7 +42863,7 @@ /obj/structure/chair/comfy/black{ dir = 8 }, -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/siding/wood/thin{ dir = 1 }, /turf/open/floor/wood, @@ -42627,7 +42874,7 @@ pixel_x = 1; pixel_y = 9 }, -/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "mCc" = ( @@ -43361,6 +43608,12 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"mPK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/science/server) "mPW" = ( /obj/structure/rack, /obj/effect/turf_decal/stripes/corner{ @@ -43402,6 +43655,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/paramedic) +"mQs" = ( +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/obj/machinery/light_switch{ + pixel_y = 27 + }, +/obj/machinery/rack_creator, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "mQu" = ( /obj/structure/table, /obj/item/storage/belt/medical{ @@ -43447,26 +43710,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"mQY" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_interior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = 8; - pixel_y = 24; - req_one_access_txt = "30;70" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "mRj" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 @@ -43501,10 +43744,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"mSg" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "mSl" = ( /obj/structure/closet/l3closet/scientist, /obj/effect/turf_decal/trimline/purple/filled/line/lower{ @@ -43719,12 +43958,6 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) -"mVN" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "mVV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 8 @@ -44050,6 +44283,10 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) +"nby" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "nbA" = ( /obj/machinery/vending/sustenance, /obj/effect/decal/cleanable/dirt, @@ -44363,16 +44600,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"nfC" = ( -/obj/structure/chair/office/dark, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "nfK" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -44466,6 +44693,12 @@ /obj/effect/turf_decal/trimline/secred/filled/corner/lower, /turf/open/floor/plasteel, /area/security/brig) +"nhY" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 1 + }, +/turf/open/floor/circuit/telecomms/server, +/area/science/server) "nia" = ( /turf/template_noop, /area/hydroponics) @@ -44598,23 +44831,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"nlV" = ( -/obj/machinery/door/airlock/command/glass{ - id_tag = "secondary_aicore_exterior"; - name = "Physical Core Access"; - req_one_access_txt = "30;70" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ - dirx = 1; - diry = 1 - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "nlY" = ( /obj/effect/landmark/stationroom/maint/tenxfive, /turf/template_noop, @@ -44700,14 +44916,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"nnx" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "nnM" = ( /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -44719,10 +44927,6 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "nnN" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff"; - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 }, @@ -44735,6 +44939,10 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 4 }, +/obj/effect/turf_decal/arrows/white{ + color = "#99ccff"; + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "nos" = ( @@ -44768,17 +44976,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) -"npc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/flasher{ - id = "AI"; - pixel_x = 8; - pixel_y = -23 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "npK" = ( /obj/machinery/light{ dir = 8 @@ -44867,6 +45064,12 @@ }, /turf/closed/wall/r_wall, /area/engine/atmos/mix) +"nrO" = ( +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "nsj" = ( /obj/machinery/airalarm{ dir = 8; @@ -45066,12 +45269,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"nuL" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/lobby) "nuT" = ( /obj/structure/sign/warning/electricshock{ pixel_y = -32 @@ -45364,6 +45561,12 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"nAA" = ( +/obj/structure/ethernet_cable{ + icon_state = "4-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "nAZ" = ( /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 1 @@ -45405,11 +45608,6 @@ "nBp" = ( /turf/closed/wall/r_wall, /area/engine/atmos/storage) -"nBu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "nCd" = ( /obj/structure/chair{ dir = 4; @@ -45573,9 +45771,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"nDA" = ( -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "nDC" = ( /obj/machinery/rnd/server/master, /turf/open/floor/circuit/telecomms/server, @@ -45696,6 +45891,15 @@ /obj/effect/turf_decal/trimline/green/filled/line/lower, /turf/open/floor/plasteel/white, /area/medical/virology) +"nGM" = ( +/obj/machinery/status_display/ai{ + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "nHm" = ( /obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel, @@ -45745,19 +45949,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"nHT" = ( -/obj/machinery/camera{ - c_tag = "AI Chamber - Port"; - dir = 8; - network = list("aicore") - }, -/obj/machinery/requests_console{ - department = "AI"; - departmentType = 5; - pixel_y = -32 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) "nHU" = ( /obj/machinery/requests_console{ department = "Science"; @@ -45806,6 +45997,25 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"nIL" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "nJl" = ( /obj/effect/turf_decal/pool{ dir = 8 @@ -45894,25 +46104,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"nKN" = ( -/obj/machinery/doorButtons/access_button{ - idDoor = "ai_core_airlock_exterior"; - idSelf = "ai_core_airlock_control"; - pixel_x = -23; - pixel_y = 7 - }, -/obj/machinery/light, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "nKP" = ( /obj/effect/turf_decal/loading_area{ dir = 1 @@ -46011,6 +46202,21 @@ }, /turf/open/floor/plasteel, /area/science/nanite) +"nNh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "nNC" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ @@ -46101,6 +46307,16 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/storage) +"nRg" = ( +/obj/structure/frame/machine{ + anchored = 1; + state = 2 + }, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "nRs" = ( /obj/machinery/door/airlock/research/glass{ name = "Genetics Research"; @@ -46248,22 +46464,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"nSR" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/sign/departments/minsky/command/charge{ - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 8 - }, -/obj/item/kirbyplants/photosynthetic{ - pixel_y = 10 - }, -/obj/structure/table, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "nTv" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 @@ -46488,14 +46688,6 @@ }, /turf/open/floor/plasteel, /area/security/brig) -"nXh" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/turf/open/floor/plasteel, -/area/science/misc_lab) "nXj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ @@ -46604,9 +46796,6 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "nZg" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, /obj/effect/turf_decal/ramp_middle, /turf/open/floor/wood, /area/library) @@ -46616,6 +46805,21 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) +"oae" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "2-8" + }, +/obj/structure/ethernet_cable{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "oaq" = ( /obj/effect/turf_decal/ramp_middle{ dir = 1 @@ -46687,6 +46891,21 @@ }, /turf/open/floor/plasteel, /area/quartermaster/qm) +"obA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "obK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -46833,6 +47052,13 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower, /turf/open/floor/plasteel/dark, /area/bridge) +"oeL" = ( +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "oeV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 @@ -46932,12 +47158,6 @@ }, /turf/open/space/basic, /area/ai_monitored/turret_protected/ai) -"ogm" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "ogV" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/yellow{ @@ -46959,13 +47179,6 @@ /obj/effect/turf_decal/trimline/engiyellow/filled/line/lower, /turf/open/floor/plasteel, /area/engine/engineering) -"ohh" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "ohr" = ( /obj/structure/cable{ icon_state = "1-4"; @@ -47037,6 +47250,24 @@ /obj/item/stock_parts/cell/high/plus, /turf/open/floor/plasteel/white, /area/storage/tech) +"ojj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/hatch{ + name = "Abandoned Room"; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/barricade/wooden/crude, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/grimy, +/area/ai_monitored/turret_protected/aisat_interior) "ojr" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -47266,9 +47497,6 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "onr" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 }, @@ -47278,6 +47506,10 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 1 }, +/obj/effect/turf_decal/arrows/white{ + color = "#99ccff"; + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "onB" = ( @@ -47597,13 +47829,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"otV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "ous" = ( /obj/effect/turf_decal/trimline/secred/warning/lower{ dir = 1 @@ -47643,39 +47868,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) -"ouB" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/airlock/highsecurity{ - id_tag = "ai_core_airlock_exterior"; - name = "AI Core"; - req_access_txt = "65" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/ai) "ouF" = ( /obj/machinery/airalarm{ dir = 8; @@ -47722,6 +47914,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"ovp" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/netmin, +/obj/structure/sign/plaques/kiddie{ + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "ovw" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -47944,9 +48146,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "oyI" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, /obj/effect/turf_decal/ramp_middle, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -48270,6 +48469,14 @@ /obj/machinery/suit_storage_unit/security, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"oEJ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/ai/server_cabinet/prefilled, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "oGk" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/reagent_dispensers/watertank, @@ -48330,6 +48537,7 @@ persistence_id = "public"; pixel_x = -32 }, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/library) "oHK" = ( @@ -48387,8 +48595,8 @@ "oIO" = ( /obj/docking_port/stationary/random{ dir = 4; - shuttle_id = "pod_lavaland4"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland4" }, /turf/open/space, /area/space) @@ -48418,6 +48626,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/aft) +"oJs" = ( +/obj/structure/table/wood, +/obj/item/toy/figure/borg{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/machinery/newscaster/security_unit{ + pixel_y = -28 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "oJt" = ( /obj/structure/cable{ icon_state = "1-4" @@ -48532,6 +48751,11 @@ }, /turf/open/floor/plasteel, /area/science/robotics/lab) +"oLl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/ai_monitored/secondarydatacore) "oLx" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -48738,6 +48962,17 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"oOt" = ( +/obj/structure/table, +/obj/item/electropack, +/obj/item/healthanalyzer, +/obj/item/assembly/signaler, +/obj/effect/turf_decal/trimline/blue/filled/line/lower, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/misc_lab) "oOK" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/closet/firecloset, @@ -48781,9 +49016,6 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "oPJ" = ( -/obj/machinery/reagentgrinder/kitchen{ - pixel_y = 6 - }, /obj/structure/table, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) @@ -49396,6 +49628,14 @@ }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) +"pdZ" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "pen" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -49514,9 +49754,9 @@ /area/quartermaster/office) "pfS" = ( /obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood, /obj/item/camera_film, /obj/item/camera_film, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "pgn" = ( @@ -49647,7 +49887,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -49667,20 +49907,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"phR" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - external_pressure_bound = 120; - name = "server vent" - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "pia" = ( /obj/effect/turf_decal/stripes{ dir = 4 @@ -49744,10 +49970,10 @@ /obj/structure/chair/comfy/black{ dir = 4 }, -/obj/effect/turf_decal/siding/wood{ +/obj/machinery/light, +/obj/effect/turf_decal/siding/wood/thin{ dir = 1 }, -/obj/machinery/light, /turf/open/floor/wood, /area/library) "piv" = ( @@ -49776,27 +50002,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"piV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/starboard/aft) -"pjc" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff"; - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "pjh" = ( /obj/structure/closet/lasertag/red, /turf/open/floor/plasteel, @@ -49920,20 +50125,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"plY" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Northwest"; - dir = 4; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/trimline/purple/filled/line/lower{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "pmx" = ( /obj/structure/table, /obj/machinery/light{ @@ -50634,10 +50825,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"pyn" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/turret_protected/ai) +"pyv" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/closed/wall, +/area/science/mixing) "pyy" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -50711,14 +50904,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"pyZ" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "pzg" = ( /obj/machinery/door/airlock/medical{ name = "Operating Theatre"; @@ -50978,10 +51163,6 @@ icon_state = "platingdmg3" }, /area/maintenance/aft) -"pDa" = ( -/obj/machinery/ai/data_core, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/ai_monitored/secondarydatacore) "pDm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -51145,8 +51326,8 @@ "pFB" = ( /obj/docking_port/stationary/random{ dir = 4; - shuttle_id = "pod_lavaland3"; - name = "lavaland" + name = "lavaland"; + shuttle_id = "pod_lavaland3" }, /turf/open/space, /area/space/nearstation) @@ -51232,6 +51413,18 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) +"pIg" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/structure/table, +/obj/item/stack/ethernet_coil, +/obj/item/clothing/shoes/magboots, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "pIj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -51355,6 +51548,56 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/mix) +"pMo" = ( +/obj/machinery/ai/data_core/primary, +/obj/machinery/power/apc/highcap{ + dir = 8; + name = "AI Chamber APC"; + pixel_x = -25 + }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/obj/item/radio/intercom{ + anyai = 1; + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_y = -27 + }, +/obj/item/radio/intercom{ + anyai = 1; + broadcasting = 0; + freerange = 1; + frequency = 1447; + name = "Private Channel"; + pixel_y = 20 + }, +/obj/item/radio/intercom{ + broadcasting = 0; + freerange = 1; + listening = 1; + name = "Common Channel"; + pixel_y = -37 + }, +/obj/machinery/turretid{ + icon_state = "control_stun"; + name = "AI Chamber turret control"; + pixel_x = -1; + pixel_y = 38 + }, +/obj/machinery/button/door{ + id = "aicoredoor"; + name = "AI Chamber entrance shutters control"; + pixel_x = -23; + pixel_y = 21; + req_access_txt = "16" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/circuit/green/telecomms, +/area/ai_monitored/turret_protected/ai) "pMs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -51488,6 +51731,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"pPM" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "pPW" = ( /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) @@ -51538,6 +51787,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"pQf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "pQq" = ( /obj/machinery/vending/snack/random, /turf/open/floor/plasteel/dark, @@ -52062,28 +52320,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/courtroom) -"pYv" = ( -/obj/machinery/camera{ - c_tag = "Secondary AI Core"; - dir = 8; - network = list("ss13","rd") - }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/machinery/power/smes/engineering{ - charge = 5e+006; - input_level = 25000; - output_level = 20000 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/secondarydatacore) "pYC" = ( /obj/structure/weightmachine/weightlifter, /turf/open/floor/plasteel, @@ -52164,6 +52400,15 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) +"qan" = ( +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/barricade/wooden/crude, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "qas" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -52490,6 +52735,13 @@ /obj/effect/turf_decal/trimline/purple/filled/line/lower, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"qhr" = ( +/obj/machinery/light, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "qhA" = ( /obj/structure/transit_tube/curved/flipped{ dir = 8 @@ -52578,6 +52830,20 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"qiX" = ( +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Xenobiology Northwest"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "qjc" = ( /obj/structure/disposalpipe/sorting/mail{ sortType = 10 @@ -52600,6 +52866,13 @@ /obj/effect/turf_decal/trimline/secred/filled/corner/lower, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"qjq" = ( +/obj/machinery/ai/data_core, +/obj/structure/ethernet_cable{ + icon_state = "0-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "qjx" = ( /obj/structure/sign/warning/electricshock{ pixel_y = 32 @@ -52631,18 +52904,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel/dark, /area/security/courtroom) -"qjZ" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/starboard/aft"; - dir = 1; - name = "Starboard Quarter Maintenance APC"; - pixel_y = 23 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "qkk" = ( /obj/effect/turf_decal/trimline/secred/filled/corner/lower{ dir = 1 @@ -52701,7 +52962,7 @@ }, /obj/machinery/door/airlock/engineering{ name = "Engine Room"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -52789,6 +53050,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) +"qma" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/closed/wall, +/area/science/mixing) "qmf" = ( /obj/item/storage/fancy/donut_box, /obj/structure/table, @@ -52885,17 +53150,6 @@ /obj/item/storage/fancy/donut_box, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/captain) -"qnU" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/research) "qoe" = ( /obj/structure/cable{ icon_state = "1-8" @@ -53027,7 +53281,7 @@ "qpF" = ( /obj/machinery/door/airlock{ name = "Service Hall"; - req_one_access_txt = "25;26;35;28;46;37;38;36" + req_access_txt = "79" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ @@ -53077,6 +53331,12 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/captain) +"qrM" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "qsk" = ( /obj/machinery/firealarm{ dir = 4; @@ -53292,6 +53552,15 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"qwC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1; + external_pressure_bound = 140; + plane = -2; + pressure_checks = 0 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "qwF" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -53385,20 +53654,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/plasteel, /area/security/courtroom) -"qzd" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/computer/ai_control_console{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "qzt" = ( /obj/machinery/door/airlock/external{ name = "Engineering External Access"; - req_access_txt = "10;13" + req_access_txt = "10" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ dirx = 2; @@ -53677,12 +53936,34 @@ dir = 8; dwidth = 5; height = 7; - shuttle_id = "supply_home"; name = "Cargo Bay"; + shuttle_id = "supply_home"; width = 12 }, /turf/open/space/basic, /area/space) +"qGn" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "qGt" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53874,13 +54155,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"qHY" = ( -/obj/structure/girder/displaced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "qIr" = ( /obj/structure/table, /obj/item/storage/lockbox/vialbox/virology{ @@ -53969,6 +54243,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"qJA" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/research/glass{ + name = "Computer Science"; + normalspeed = 0; + req_access_txt = "67" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "qJI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -54092,20 +54383,6 @@ /obj/effect/turf_decal/trimline/green/filled/corner/lower, /turf/open/floor/plasteel, /area/hydroponics/garden) -"qLi" = ( -/obj/machinery/camera{ - c_tag = "MiniSat - Monitoring room"; - dir = 8; - network = list("minisat","ss13") - }, -/obj/machinery/newscaster/security_unit{ - pixel_x = 28 - }, -/obj/machinery/computer/ai_resource_distribution{ - dir = 8 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "qLt" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54401,6 +54678,22 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft_starboard) +"qQe" = ( +/obj/machinery/computer/security/telescreen{ + dir = 8; + name = "MiniSat Camera Monitor"; + network = list("minisat","aicore"); + pixel_x = 26 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/obj/machinery/computer/telecomms/server{ + dir = 8; + network = "tcommsat" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "qQn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -54417,15 +54710,6 @@ /obj/effect/turf_decal/trimline/secred/filled/line/lower, /turf/open/floor/plasteel, /area/security/brig) -"qQs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "qQw" = ( /obj/machinery/telecomms/server/presets/common, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -54469,6 +54753,10 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 4 }, +/obj/effect/turf_decal/arrows/white{ + color = "#99ccff"; + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "qRq" = ( @@ -54534,6 +54822,13 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) +"qTb" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel/dark, +/area/science/server) "qTf" = ( /obj/effect/landmark/start/yogs/clerk, /turf/template_noop, @@ -54554,10 +54849,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/purple/filled/corner/lower, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ dir = 8 }, -/obj/effect/turf_decal/trimline/purple/filled/corner/lower, /turf/open/floor/plasteel/white, /area/science/research) "qTl" = ( @@ -54656,6 +54951,10 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"qVj" = ( +/obj/structure/closet/cardboard, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "qVp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -54666,6 +54965,13 @@ }, /turf/open/floor/plating, /area/storage/tech) +"qVG" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, +/turf/open/floor/plasteel/white, +/area/science/research) "qVH" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -54673,7 +54979,7 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "qVM" = ( -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/siding/wood/thin{ dir = 8 }, /turf/open/floor/wood, @@ -54873,6 +55179,9 @@ /obj/structure/window/reinforced{ dir = 8 }, +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "qZK" = ( @@ -54899,6 +55208,11 @@ /obj/effect/turf_decal/trimline/atmos/warning/lower/corner, /turf/open/floor/plasteel, /area/engine/atmos/foyer) +"rav" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "ray" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 @@ -54943,15 +55257,6 @@ }, /turf/open/floor/engine/n2o, /area/engine/atmos/distro) -"rbD" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "rbH" = ( /obj/effect/turf_decal/trimline/blue/filled/corner/lower{ dir = 4 @@ -55569,15 +55874,6 @@ "rnS" = ( /turf/template_noop, /area/security/execution/transfer) -"rnX" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "rod" = ( /obj/effect/spawner/structure/window, /obj/structure/cloth_curtain{ @@ -55598,7 +55894,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -55696,6 +55992,25 @@ /obj/effect/turf_decal/trimline/atmos/warning/lower/nobottom, /turf/open/floor/plasteel, /area/engine/atmos/mix) +"rqz" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Antechamber"; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "rqB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 8 @@ -55712,6 +56027,15 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"rqN" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "rqS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -55771,13 +56095,6 @@ }, /turf/open/floor/plasteel/white, /area/security/brig) -"rrF" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - layer = 2.35; - - }, -/turf/closed/wall, -/area/science/mixing) "rrL" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor{ @@ -55895,6 +56212,12 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, /area/maintenance/port/fore) +"rtv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "rtN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55934,15 +56257,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) -"rur" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ai_monitored/storage/satellite) "rvc" = ( /obj/machinery/light, /obj/item/radio/intercom{ @@ -56088,15 +56402,30 @@ /turf/closed/wall/r_wall, /area/science/lab) "rym" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/machinery/vending/coffee, +/obj/effect/turf_decal/siding/wood/thin{ + dir = 9 + }, /turf/open/floor/wood, /area/library) +"ryI" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/ethernet_cable{ + icon_state = "1-2" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "ryJ" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 @@ -56254,6 +56583,15 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"rBs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "rBz" = ( /obj/item/radio/intercom{ pixel_y = -27 @@ -56275,15 +56613,6 @@ /obj/effect/turf_decal/trimline/secred/filled/line/lower, /turf/open/floor/plasteel, /area/security/main) -"rCd" = ( -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "rCp" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/yellow, @@ -56414,7 +56743,7 @@ "rEz" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering"; - req_access_txt = "32" + req_one_access_txt = "10;32" }, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -57156,6 +57485,22 @@ "rPO" = ( /turf/closed/wall/r_wall, /area/security/prison/hallway) +"rPT" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/obj/machinery/ai/networking{ + label = "Computer Science - 2"; + roundstart_connection = "Subcontroller" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "rQM" = ( /obj/structure/chair{ dir = 8 @@ -57247,15 +57592,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"rRJ" = ( -/obj/structure/closet/crate/secure/gear/donut, -/obj/item/reagent_containers/food/snacks/donut, -/obj/item/paper/guides/jobs/security/donut, -/obj/machinery/camera/motion/armory{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/security/armory) "rRQ" = ( /obj/machinery/computer/security{ dir = 1 @@ -57380,18 +57716,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/paramedic) -"rUm" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "rUn" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, @@ -57661,6 +57985,12 @@ "rZt" = ( /turf/closed/wall, /area/medical/paramedic) +"rZC" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "rZU" = ( /obj/machinery/light{ dir = 8; @@ -58379,14 +58709,6 @@ "sny" = ( /turf/closed/wall, /area/crew_quarters/heads/cmo) -"snB" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "snF" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -58412,12 +58734,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"soe" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "soo" = ( /turf/closed/wall, /area/engine/atmos/mix) @@ -58429,7 +58745,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft_starboard) "soW" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /obj/machinery/light/small{ dir = 8 }, @@ -58861,6 +59177,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"syV" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "szt" = ( /obj/machinery/door/airlock/public/glass{ name = "Robotics Access" @@ -59325,16 +59647,6 @@ }, /turf/open/floor/grass, /area/medical/genetics) -"sHf" = ( -/obj/machinery/airalarm/server{ - dir = 4; - pixel_x = -24 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/science/server) "sHn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 @@ -59575,12 +59887,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) -"sLZ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "sMh" = ( /obj/structure/filingcabinet, /obj/machinery/light_switch{ @@ -59952,6 +60258,19 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, /turf/open/floor/plasteel, /area/hallway/primary/central) +"sUH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + dir = 1; + external_pressure_bound = 120; + plane = -2 + }, +/obj/machinery/camera{ + c_tag = "Secondary AI Core"; + dir = 4; + network = list("ss13","rd") + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "sVz" = ( /obj/structure/window/reinforced{ dir = 8 @@ -59992,6 +60311,15 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"sVS" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/modular_computer/console/preset/tcomms{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "sWv" = ( /obj/effect/turf_decal/trimline/brown/filled/line/lower{ dir = 9 @@ -60266,6 +60594,19 @@ /obj/item/deskbell/preset/kitchen, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) +"sZl" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Teleporter Room"; + req_one_access_txt = "17;65" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "sZy" = ( /obj/effect/turf_decal/trimline/brown/filled/line/lower{ dir = 8 @@ -60474,6 +60815,18 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) +"tcR" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/ai/networking{ + label = "Main Core"; + roundstart_connection = "Computer Science" + }, +/obj/structure/ethernet_cable{ + icon_state = "0-4" + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/turret_protected/ai) "tdh" = ( /obj/machinery/door/airlock/grunge{ name = "Permanent Cell 2" @@ -60692,12 +61045,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plasteel, /area/hallway/secondary/exit) -"the" = ( -/obj/effect/turf_decal/stripes, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/wood, -/area/library) "thk" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 1 @@ -60723,13 +61070,6 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"thv" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "thI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ @@ -60804,13 +61144,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/security/prison) -"tiN" = ( -/obj/machinery/light, -/obj/machinery/computer/ai_server_console{ - dir = 1 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "tjk" = ( /obj/structure/closet, /obj/item/storage/box/donkpockets, @@ -61200,6 +61533,14 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"tqK" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "trb" = ( /turf/closed/wall, /area/maintenance/fore/secondary) @@ -61269,6 +61610,21 @@ }, /turf/open/floor/plating, /area/ai_monitored/security/armory) +"tsh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "tss" = ( /obj/machinery/door/airlock/atmos{ name = "Tanks and Filtration"; @@ -61462,12 +61818,6 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"twt" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "twB" = ( /obj/structure/cable{ icon_state = "2-4" @@ -61679,6 +62029,7 @@ /area/crew_quarters/bar) "tBG" = ( /obj/structure/railing, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/library) "tBZ" = ( @@ -61904,12 +62255,6 @@ }, /turf/open/floor/plating, /area/security/prison) -"tGz" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "tGM" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -61917,6 +62262,15 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/mix) +"tHf" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "tHj" = ( /obj/structure/cable{ icon_state = "1-4" @@ -62009,21 +62363,6 @@ }, /turf/open/floor/plating, /area/bridge/meeting_room) -"tHJ" = ( -/obj/machinery/camera{ - c_tag = "AI Chamber - Port"; - dir = 4; - network = list("aicore") - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "tHZ" = ( /obj/structure/chair/office/light{ dir = 1 @@ -62077,6 +62416,9 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) +"tJD" = ( +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "tJN" = ( /obj/machinery/light{ dir = 1 @@ -62178,7 +62520,7 @@ "tKP" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Four"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_target{ dirx = -2; @@ -62502,16 +62844,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"tQv" = ( -/obj/machinery/light{ +"tQk" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8; - external_pressure_bound = 140; - pressure_checks = 0 +/obj/structure/ethernet_cable{ + icon_state = "2-8" }, -/turf/open/floor/circuit/telecomms/server, +/turf/open/floor/catwalk_floor/telecomms, /area/ai_monitored/secondarydatacore) "tQy" = ( /obj/machinery/computer/arcade/battle, @@ -62813,6 +63153,21 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, /area/science/research) +"tVF" = ( +/obj/machinery/camera{ + c_tag = "MiniSat - Monitoring room"; + dir = 8; + network = list("minisat","ss13") + }, +/obj/machinery/newscaster/security_unit{ + pixel_x = 28 + }, +/obj/machinery/computer/telecomms/traffic{ + dir = 8; + network = "tcommsat" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "tVL" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -62849,9 +63204,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"tXb" = ( -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/ai_monitored/secondarydatacore) "tXk" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 4 @@ -62879,6 +63231,20 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plasteel, /area/science/misc_lab) +"tXR" = ( +/obj/machinery/airalarm/server{ + dir = 4; + pixel_x = -24 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/ai/master_subcontroller, +/obj/structure/ethernet_cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/science/server) "tYa" = ( /obj/machinery/camera{ c_tag = "Aft Port Solar Access"; @@ -62963,23 +63329,6 @@ }, /turf/open/floor/plasteel, /area/engine/engine_smes) -"tZD" = ( -/obj/machinery/flasher{ - id = "AI"; - pixel_x = 24; - pixel_y = -10 - }, -/obj/machinery/camera/motion{ - c_tag = "MiniSat Foyer"; - dir = 8; - network = list("minisat","ss13") - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "tZF" = ( /obj/effect/turf_decal/trimline/green/filled/corner/lower{ dir = 4 @@ -63135,9 +63484,9 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "ucC" = ( -/obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "ucF" = ( @@ -63333,6 +63682,13 @@ }, /turf/open/floor/plating, /area/security/prison) +"ugz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ + external_pressure_bound = 120; + plane = -2 + }, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "ugB" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 4 @@ -63360,13 +63716,6 @@ /turf/open/floor/plasteel, /area/engine/atmos/mix) "uhU" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/effect/turf_decal/ramp_middle, /obj/effect/turf_decal/ramp_middle, /obj/structure/bookcase/random/adult, /turf/open/floor/carpet, @@ -63535,9 +63884,6 @@ /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "ums" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#99ccff" - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 4 }, @@ -63835,7 +64181,7 @@ /area/maintenance/disposal/incinerator) "urt" = ( /obj/machinery/computer/crew, -/obj/effect/turf_decal/trimline/purple/filled/line/lower{ +/obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -63969,16 +64315,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"uuW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "uvc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -64318,41 +64654,10 @@ }, /turf/open/floor/plasteel, /area/security/processing) -"uDo" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Research Director"; - req_access_txt = "30" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/heads/hor) "uDp" = ( /obj/machinery/door/airlock/engineering/glass{ name = "AI Satellite Monitoring"; - req_one_access_txt = "10;61" + req_access_txt = "10" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -64487,30 +64792,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"uFS" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/doorButtons/access_button{ - idDoor = "secondary_aicore_exterior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Button"; - pixel_x = -24; - pixel_y = 8; - req_one_access_txt = "30;70" - }, -/obj/machinery/doorButtons/airlock_controller{ - idExterior = "secondary_aicore_exterior"; - idInterior = "secondary_aicore_interior"; - idSelf = "secondary_aicore_controller"; - name = "Secondary AI Core Access Console"; - pixel_x = -26; - pixel_y = -6; - req_one_access_txt = "30;70" - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/circuit/telecomms/server, -/area/ai_monitored/secondarydatacore) "uFW" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plating, @@ -64593,6 +64874,16 @@ }, /turf/open/floor/plasteel, /area/medical/morgue) +"uHL" = ( +/obj/machinery/modular_computer/console/preset/netmin{ + dir = 1 + }, +/obj/structure/ethernet_cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "uHN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -64778,6 +65069,11 @@ /obj/item/stock_parts/micro_laser/high, /turf/open/floor/plasteel/white, /area/storage/tech) +"uKh" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/storage) "uKj" = ( /obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/stone, @@ -65070,25 +65366,6 @@ /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/plasteel, /area/security/courtroom) -"uOG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, -/turf/open/floor/plasteel/white, -/area/science/research) "uON" = ( /obj/structure/lattice/catwalk, /obj/structure/cable/yellow{ @@ -65247,24 +65524,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"uSq" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "uTe" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; @@ -65587,24 +65846,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/library) -"uYw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 +"uYD" = ( +/obj/structure/ethernet_cable{ + icon_state = "1-8" }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 +/obj/structure/ethernet_cable{ + icon_state = "1-4" }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) +/obj/machinery/light, +/turf/open/floor/catwalk_floor/telecomms, +/area/ai_monitored/secondarydatacore) "uYM" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -65728,8 +65979,8 @@ /area/medical/storage) "vbw" = ( /obj/item/kirbyplants/photosynthetic, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ - dir = 1 +/obj/effect/turf_decal/trimline/dark_blue/warning/lower/nobottom{ + dir = 9 }, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) @@ -65792,7 +66043,7 @@ /area/medical/genetics) "vca" = ( /obj/machinery/computer/aifixer, -/obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -66567,6 +66818,19 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"vrr" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/circuitboard/machine/ai_data_core, +/obj/item/circuitboard/machine/server_cabinet, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "vrz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -66627,6 +66891,24 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"vtn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "vtv" = ( /obj/machinery/door/poddoor/preopen{ id = "misclab"; @@ -66684,6 +66966,15 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"vuj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "vum" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -66702,7 +66993,7 @@ dir = 4; name = "Fuel Port" }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/construction/mining/aux_base) "vuH" = ( @@ -66748,16 +67039,6 @@ /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"vvS" = ( -/obj/machinery/status_display/ai{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner/lower, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "vvV" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -66781,10 +67062,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "vvZ" = ( -/obj/effect/turf_decal/stripes, /obj/structure/railing/corner{ dir = 1 }, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "vwa" = ( @@ -67516,6 +67797,12 @@ /obj/effect/turf_decal/trimline/blue/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/paramedic) +"vHv" = ( +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ai_monitored/storage/satellite) "vHH" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -67605,9 +67892,9 @@ dir = 8; dwidth = 3; height = 5; - shuttle_id = "mining_home"; name = "mining shuttle bay"; roundstart_template = /datum/map_template/shuttle/mining/box; + shuttle_id = "mining_home"; width = 7 }, /turf/open/space/basic, @@ -67858,10 +68145,6 @@ /mob/living/carbon/monkey/punpun, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"vMR" = ( -/obj/structure/filingcabinet, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "vMZ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -67940,6 +68223,25 @@ }, /turf/open/floor/plasteel, /area/quartermaster/sorting) +"vNU" = ( +/obj/machinery/doorButtons/access_button{ + idDoor = "ai_core_airlock_exterior"; + idSelf = "ai_core_airlock_control"; + pixel_x = -23; + pixel_y = 7 + }, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/ai) "vOj" = ( /obj/machinery/space_heater, /turf/open/floor/plating{ @@ -68296,25 +68598,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) -"vUR" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/ai) "vVb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 @@ -68558,6 +68841,13 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/main) +"vZl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/ai/server_cabinet, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "vZm" = ( /obj/machinery/door/airlock/mining/glass{ name = "Cargo Office"; @@ -68602,6 +68892,10 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"vZp" = ( +/obj/item/chair, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "vZq" = ( /obj/machinery/vending/wardrobe/chem_wardrobe, /obj/machinery/airalarm{ @@ -68804,14 +69098,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"wer" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/frame/machine{ - anchored = 1; - state = 2 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "weD" = ( /obj/machinery/disposal/deliveryChute{ dir = 8 @@ -68821,6 +69107,14 @@ }, /turf/open/floor/plating, /area/quartermaster/sorting) +"weM" = ( +/obj/machinery/ai/networking{ + label = "Subcontroller"; + roundstart_connection = "Computer Science - 2" + }, +/obj/structure/ethernet_cable, +/turf/open/floor/circuit/telecomms/server, +/area/science/server) "weQ" = ( /obj/effect/turf_decal/bot_white/right, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -69113,6 +69407,11 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"wkv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "wkE" = ( /obj/machinery/door/airlock/external{ name = "External Access"; @@ -69309,13 +69608,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) -"wnI" = ( -/obj/structure/frame/machine{ - anchored = 1; - state = 2 - }, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/ai_monitored/secondarydatacore) "wnN" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -69604,6 +69896,20 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"wtP" = ( +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "wtR" = ( /obj/structure/cable{ icon_state = "2-4" @@ -69715,6 +70021,20 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"wwC" = ( +/obj/machinery/camera{ + c_tag = "AI Chamber - Port"; + dir = 8; + network = list("aicore") + }, +/obj/machinery/requests_console{ + department = "AI"; + departmentType = 5; + pixel_x = 0; + pixel_y = -32 + }, +/turf/open/floor/circuit/telecomms/server, +/area/ai_monitored/turret_protected/ai) "wwL" = ( /obj/effect/spawner/structure/window/reinforced/shutter, /obj/structure/cable{ @@ -70071,21 +70391,6 @@ }, /turf/open/floor/plating, /area/maintenance/aft) -"wEX" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 6 - }, -/obj/item/pen, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "wFh" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -70095,6 +70400,21 @@ }, /turf/open/floor/plasteel, /area/engine/atmos/distro) +"wFn" = ( +/obj/structure/railing, +/obj/effect/turf_decal/ramp_middle, +/obj/effect/turf_decal/ramp_middle{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/siding/wood/thin, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/library) "wFr" = ( /obj/machinery/light_switch{ pixel_y = -25 @@ -70725,6 +71045,13 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/aft) +"wUt" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "wUw" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -70777,6 +71104,11 @@ }, /turf/open/floor/plasteel, /area/quartermaster/storage) +"wVr" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "wVt" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -71301,6 +71633,12 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"xfG" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/trimline/purple/filled/line/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "xfH" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -71308,6 +71646,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) +"xfJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "xgh" = ( /obj/structure/transit_tube/junction{ dir = 4 @@ -71362,12 +71715,6 @@ }, /turf/open/floor/plasteel/dark, /area/bridge) -"xgS" = ( -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/ai_monitored/storage/satellite) "xhk" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 @@ -71616,9 +71963,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/storage) -"xlV" = ( -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "xmb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 5 @@ -71722,6 +72066,22 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/aisat_interior) +"xnW" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "xoz" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/stripes/corner{ @@ -72135,25 +72495,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"xwL" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/toy/figure/borg{ - pixel_x = -4; - pixel_y = -2 - }, -/obj/item/phone{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/machinery/newscaster/security_unit{ - pixel_y = -28 - }, -/turf/open/floor/plasteel/grimy, -/area/ai_monitored/turret_protected/aisat_interior) "xwU" = ( /obj/structure/closet/secure_closet/atmospherics, /obj/machinery/light{ @@ -72649,8 +72990,8 @@ /turf/open/floor/plasteel, /area/security/prison) "xFp" = ( -/obj/effect/turf_decal/siding/wood, /obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood/thin, /turf/open/floor/wood, /area/library) "xFt" = ( @@ -72919,6 +73260,14 @@ /obj/item/kirbyplants/random, /turf/open/floor/carpet, /area/library) +"xLm" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner/lower, +/turf/open/floor/plasteel, +/area/science/misc_lab) "xLu" = ( /obj/machinery/computer/communications, /obj/effect/turf_decal/trimline/dark_blue/filled/line/lower{ @@ -73102,6 +73451,10 @@ /obj/effect/turf_decal/trimline/blue/filled/line/lower{ dir = 8 }, +/obj/effect/turf_decal/arrows/white{ + color = "#99ccff"; + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "xPE" = ( @@ -73249,20 +73602,6 @@ /obj/effect/turf_decal/trimline/purple/filled/corner/lower, /turf/open/floor/plasteel, /area/science/robotics/mechbay) -"xSs" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner/lower{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/corner/lower, -/turf/open/floor/plasteel/white, -/area/science/research) -"xSu" = ( -/obj/structure/closet/cardboard, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "xSN" = ( /obj/machinery/button/door{ id = "phoenixwright"; @@ -73410,13 +73749,6 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/security/main) -"xUW" = ( -/obj/structure/frame/machine{ - anchored = 1; - state = 2 - }, -/turf/open/floor/circuit/green/telecomms, -/area/ai_monitored/turret_protected/ai) "xVm" = ( /obj/effect/turf_decal/trimline/purple/filled/corner/lower{ dir = 4 @@ -73681,12 +74013,6 @@ /obj/effect/turf_decal/trimline/chemorange/filled/corner/lower, /turf/open/floor/plasteel/white, /area/medical/chemistry) -"ybM" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark/telecomms, -/area/ai_monitored/turret_protected/ai) "ybP" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -73749,6 +74075,23 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"ycN" = ( +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/obj/machinery/power/smes/engineering{ + charge = 5e+006; + input_level = 25000; + output_level = 20000 + }, +/obj/effect/turf_decal/trimline/purple/filled/line/lower{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/secondarydatacore) "ycW" = ( /obj/structure/railing{ dir = 1 @@ -73840,18 +74183,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"yfx" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "yfF" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, @@ -104143,7 +104474,7 @@ aaa aaa wlK aaZ -dVK +ckf adl adl atX @@ -104405,7 +104736,7 @@ adl xBG eRj adl -rRJ +hsK aaZ ucI cuR @@ -106509,7 +106840,7 @@ aaa aaa aPR oUy -jkJ +iNV xgM aZV vnl @@ -109580,7 +109911,7 @@ wcU aql hKi jTj -sGs +hRt exZ aql ioB @@ -110610,7 +110941,7 @@ qWa col hQg hOm -hRt +aFd aFd cFS aFd @@ -110632,11 +110963,11 @@ cru gAz lYh lYh -nuL +lYh qIz hbQ dUl -ogm +kub wSj dDw xuX @@ -112688,11 +113019,11 @@ pVW rbH lYh lYh -cwf +lYh kcy krO lLT -pjc +kub hLI dDw dZg @@ -112759,9 +113090,9 @@ sXV bhb wmr pqE -nBu +wkv ibZ -nBu +wkv jpt aqP cvV @@ -112949,7 +113280,7 @@ rJo rjM phN nnN -pjc +kub kRm bvj bvj @@ -113016,9 +113347,9 @@ tgv tgv tgv gtB -aDW +nGM sxE -vvS +bhY gtB gtB gtB @@ -113273,9 +113604,9 @@ nIj oQJ ntH vmm -rCd +tHf iKg -mVN +pPM vmm ody kfG @@ -113530,10 +113861,10 @@ nIj ycf iJL vmm -tZD -ohh -rUm -iek +aUc +wUt +gzq +sZl cZu cLg sdl @@ -113788,7 +114119,7 @@ dgV pyG vmm vmm -bSJ +rqz vmm vmm gBP @@ -114044,9 +114375,9 @@ eva oNw lmN vmm -jEd -qQs -fnK +wtP +vuj +xnW vmm vmm vmm @@ -114298,18 +114629,18 @@ tgv tFW stR dgZ -rur +csi lmN -nSR -otV -nnx -lxF -lbE +eSt +avd +pdZ +rBs +qhr vmm -vMR -wEX -lZD -xwL +nby +eLI +ivX +oJs gtB pEf aaa @@ -114555,18 +114886,18 @@ khH lvC qTh phH -iDE -fYE -snB -snB +cvU +exA +tqK +tqK cqk -bhL -snB -dEd -pyZ -dTb -nfC -hYX +lmE +tqK +ojj +fYx +dCT +rqN +sVS eeK pEf gXs @@ -114812,7 +115143,7 @@ tgv hZg cBP uIU -xgS +vHv lmN pRt kyA @@ -114820,10 +115151,10 @@ kik eEZ jWq vmm -qzd -qLi -mtW -tiN +jcv +tVF +qQe +qrM gtB pEf gXs @@ -115073,7 +115404,7 @@ tgv tgv cva cva -ouB +jpK cva cva gtB @@ -115329,9 +115660,9 @@ jXD cva cva cva -tHJ -vUR -nKN +mjZ +nIL +vNU cva cva cva @@ -115586,9 +115917,9 @@ pEf cva cva wbH -mxQ -uYw -uuW +mAe +vtn +juj wbH cva cva @@ -115844,7 +116175,7 @@ cva cva cva cva -gka +aUK cva cva cva @@ -116356,11 +116687,11 @@ cva cva cva gQa -jzm -ybM -soe -nDA -nDA +nrO +rtv +syV +kmo +kmo yap cva cva @@ -116611,15 +116942,15 @@ aaa pEf cva cva -abx +tcR gNr -npc +lqv cva cva pBl -nDA +kmo rjo -wer +oEJ cva cva pEf @@ -116868,15 +117199,15 @@ tgE koy cva cva -lHO +fJX rjo -dnj +hwy cva -jKN +pMo cva -nDA +kmo rjo -xlV +nAA cva cva vUh @@ -117125,15 +117456,15 @@ gXs pEf cva cva -xUW -jcz -cWY -lQv -grq -phR -tGz -pyn -ikV +nRg +iEk +mfs +ryI +oae +gRw +ddk +jOq +aoX cva cva pEf @@ -117385,14 +117716,14 @@ cva cva mWE lWl -tGz -car -dOp +eGL +cUl +lHg mFE kcr cva cva -cva +jXD pEf gXs gXs @@ -117645,7 +117976,7 @@ sPc fMm rlo cbd -sAu +ljG tTK cva cva @@ -117895,14 +118226,14 @@ gXs gXs pEf pEf -cva +jXD cva cva sAu rjo pkb cbd -nHT +wwC cva cva cva @@ -118098,7 +118429,7 @@ bvx soM xXT vRX -bDb +byf bDb bDb bDb @@ -118316,7 +118647,7 @@ alP syq syq syq -vTK +bMO tQg anf aFu @@ -118355,6 +118686,7 @@ byf byf byf byf +byf bDb bEm vtR @@ -118362,8 +118694,7 @@ bEm bDb bJH npK -plY -oRt +qiX oRt nAZ gIc @@ -118578,7 +118909,7 @@ aEH anf aFu aPf -ihg +cZY exz aIt aLh @@ -118610,7 +118941,8 @@ ssK vaq byf bzu -sHf +tXR +weM nDC bDb bEm @@ -118622,7 +118954,6 @@ fHi qVe yeI yeI -yeI cvr jaq chq @@ -118834,8 +119165,8 @@ alP aEH xjK aFu -lgN -ihg +wFn +cZY aIt jQY aIt @@ -118868,6 +119199,7 @@ bnE byf bzt bAy +nhY bBS bDb bEm @@ -118875,9 +119207,8 @@ cqW cBz bEm vdI -bYF -aum -buv +fhu +fIa klZ mGO qLt @@ -119092,7 +119423,7 @@ wyd dBg vBC aPP -ihg +cZY aIt aES aIt @@ -119125,6 +119456,7 @@ uUY byf bzw bAB +iHA bBV bDb aBe @@ -119132,9 +119464,8 @@ bEm nUW cLX lIR -dbB -jXZ -buu +lvD +csa yeI dDE oGo @@ -119381,7 +119712,8 @@ wTW lfD byf bzv -bAA +qTb +kCD bAs bDb bEm @@ -119390,8 +119722,7 @@ tMG bIy vtv eIW -rbD -buu +nNh yeI xwh bDb @@ -119636,10 +119967,11 @@ rOz lEQ wTW gZc -lcM +hft rLC -bAD -bBX +mPK +aKi +gHh bDb xwZ xwZ @@ -119647,8 +119979,7 @@ xwZ bIx vdI ezt -gFg -buu +lgr yeI elV lZd @@ -119867,7 +120198,7 @@ aJR aJR mJk vlM -the +ucC iNY oyI vlM @@ -119896,7 +120227,8 @@ hpG byf bKS bAC -bBW +ffJ +gIX bDb tvb egr @@ -119904,8 +120236,7 @@ bEm bDb cTX lQm -rnX -yfx +obA yeI hWy qJt @@ -120154,7 +120485,7 @@ byf byf byf byf -bDb +byf bDb bDb bDb @@ -120929,8 +121260,8 @@ bDc fFy nUQ bsf -bEo -bEo +uKh +uKh bJN eDW xwn @@ -121186,8 +121517,8 @@ bDc sgH dDp bsg -bEo -bEo +uKh +uKh bJN kCh tqt @@ -122463,11 +122794,11 @@ xVm uqy tfF tfF -xSs -dXn -uOG -kmj -qnU +qVG +kIr +dMr +ild +iOb tfF xUd rbS @@ -122722,7 +123053,7 @@ bvJ bvJ bvJ bvJ -uDo +aml bvK bvK jJG @@ -122986,8 +123317,8 @@ bEs bGc rAr cIT -kRZ -rrF +pyv +qma bTC aaf aaf @@ -123510,7 +123841,7 @@ bTl bvP ajD gvE -alf +ixP alM amW sgY @@ -123780,7 +124111,7 @@ atN atN atN atN -gLN +oGM fXS cOe gpq @@ -124030,13 +124361,13 @@ qot gFN iKk oGM -mwf +cNi oxg -uFS -sLZ -ief -tXb -oGM +ugz +jBD +rPT +sUH +ivv oGM fXS cOe @@ -124285,15 +124616,15 @@ bQZ alX xtJ gFN -nXh -oGM -mQY -nlV -gdI -kJz -mSg -wnI +xLm oGM +gVq +etp +tJD +tJD +tQk +bXk +uYD oGM fXS chH @@ -124542,15 +124873,15 @@ bQZ alY dqh qoK -gvV +eMz oGM -fKM +gqI oGM oxg oxg -dBH -pDa -oGM +rZC +iat +qjq oGM fXS cNW @@ -124799,15 +125130,15 @@ alj alj aXb xix -loK -bRR -hYY -gDs -fFO +deQ +qJA +qGn +xfJ +khi oxg -twt -wnI -oGM +rZC +iat +hhB oGM fXS bNA @@ -125056,15 +125387,15 @@ alk fxX pWH pgx -cAP +oOt oGM -pYv -goW -hOU +ycN +lPr +alq oxg -tQv -iiJ -oGM +rZC +gtd +caL oGM fXS cOe @@ -125315,13 +125646,13 @@ aRv bQZ bQZ oGM -oGM -oGM -oGM -oGM -oGM -oGM -oGM +ovp +gcS +kTH +oxg +rZC +iat +koE oGM fXS cmo @@ -125563,23 +125894,23 @@ bEC bEC bEC cOe -cOe +aQw buU cOe cwH alZ vTE dFD -thv -cOe -cOe -cOe -cOe cOe oGM +mQs +gtk +uHL +iZA +mcR +hRd oGM oGM -cOe fXS cjD cjD @@ -125821,22 +126152,22 @@ cOe cOe lNU cNW -qHY +ggA cNW cNW cdR xHc bNB cNW -cOe -cmo -cNW -iVk -cOe -cOe -ceR -fIH -cOe +oGM +eNr +pQf +wVr +oLl +eWI +tJD +oGM +mpt mfN cjD bQq @@ -126078,23 +126409,23 @@ buE axl cNW cNW -xSu -bMB +vZl +ikM cNW cNW -aMC +icd cNW cNW -cOe -cOe -bNB -cNW -cNW -axl -cOe -cNW -qjZ -uSq +oGM +vrr +bTL +xfG +oLl +eDh +qwC +oGM +bNA +kxW kQW iwk mNK @@ -126332,26 +126663,26 @@ bEs bMC cOe buG -cNZ -cNZ -bSm -aWg -cNZ -cNZ -cNZ -aMD -dMA -jPU -dMA -aue -dMA -dMA -dMA -frD -piV -xTe -bCw -bKB +jeM +cNW +fkf +buU +vZp +cNW +cOe +aMC +cOe +cOe +oGM +pIg +iJJ +oeL +oxg +hqM +hSP +oGM +cou +kEH cjD shT clz @@ -126586,29 +126917,29 @@ bEs btn bEs bEs -bEs -cNW -cNW -nex -cNW -cNW -cNW -cNW -cNW -woo -cNW -cNW -cNW -cNW -cNW cNW cNW +cOe +joY cNW -umE cNW +qan cNW -arG cNW +cOe +aMC +cOe +cOe +oGM +oGM +oGM +oGM +oGM +oGM +oGM +oGM +cdR +cRc cjD cjD cjD @@ -126843,33 +127174,33 @@ bHu btu bKf bLk -bEs -iKq -iKq -iKq -iKq -eoH -cNW -cou -cou -cae -cmo -cNW -iKq -iKq -cCG -cNW -ccW -hLb -jjr cNW -iKq -iKq -hNs -cNW -mpt cOe +cOe +kig +tsh +cNZ +aWg +cNZ +cNZ +cNZ +aMD +dMA +dMA +dMA +dMA +kaw +dMA +dMA +frD +bCw +xTe +bCw +fkO cNW +aaa +aaa +aaa aaf aaf aaf @@ -127100,33 +127431,33 @@ ujD aPn bKe bLj -bEs -iKq -iKq -iKq -iKq -iKq -euJ +cNW +axl +cOe +cOe +cNW +qVj +cmo +cNW +cOe +cOe +cOe cOe cOe -cae cOe -vKX -iKq -iKq -iKq -yeN cOe -wZs -jjr -cNW -iKq -iKq -iKq cNW -vbE +bMB cOe +lXw +cOe +cOe +cOe +cNW cNW +aaa +aaa +aaa gXs aaa aaa @@ -127358,31 +127689,31 @@ mGG bKe bLm bEs -iKq -iKq -iKq -iKq -iKq cNW -chH cNW +nex cNW cNW cNW -iKq -iKq -iKq cNW -cOe -cOe -tPY cNW -iKq -iKq -iKq -euJ -cOe -cOe +woo +cNW +cNW +cNW +cNW +cNW +cNW +cNW +cNW +umE +cNW +cNW +arG +cNW +cNW +cNW +cNW cNW gXs gXs @@ -127615,31 +127946,31 @@ bEY bEs bLl bEs -bPp -bPp -cNW -bPp -bPp -cNW -cNW +iKq +iKq +iKq +iKq +eoH cNW -aaf -pEf +cou +cou +cae +cmo cNW -bPp -bPp -bPp +iKq +iKq +cCG cNW -chH -cOe +ccW +hLb jjr cNW iKq iKq -iKq +hNs cNW -ucb -ucb +mpt +cOe cNW aaf aaa @@ -127871,31 +128202,31 @@ aaf aaf aaf aaa -aaf -aaf -aaa -aaa -aaf -aaa -aaa -aoV -aaf -aaf -pEf -aaf -gXs -gXs -pEf -cNW -cNW -cNW -hib +bEs +iKq +iKq +iKq +iKq +iKq +euJ +cOe +cOe +cae +cOe +vKX +iKq +iKq +iKq +yeN +cOe +wZs +jjr cNW iKq iKq iKq cNW -cOe +vbE cOe cNW gXs @@ -128128,32 +128459,32 @@ aaa aaa aaf aaa -aaf -aaa -aaa -aaa -aaf -aaa -aaa -aoV -aaa -aaa -aag -aaf -aaa -gXs -pEf -kAy -wEe -xgu -sHF +bEs +iKq +iKq +iKq +iKq +iKq cNW +chH cNW cNW cNW cNW +iKq +iKq +iKq cNW +cOe +cOe +tPY cNW +iKq +iKq +iKq +euJ +cOe +cOe cNW aaf aaf @@ -128385,33 +128716,33 @@ aaa aaa aaf aaa +bEs +bPp +bPp +cNW +bPp +bPp +cNW +cNW +cNW aaf -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaa -pEf -aaf -aaa -gXs pEf cNW +bPp +bPp +bPp cNW -cNW +chH cOe +jjr cNW iKq iKq iKq -iKq -eoH cNW -aaa +ucb +ucb +cNW aoV aaa aaa @@ -128617,144 +128948,144 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa -aaf -aaa -aaa -aaa -aag -aaa -aaa -aaa -aaa -aaa -pEf -aaa -aaa -gXs -gXs -gXs -cNW -cmo -cOe -vKX -iKq -iKq -iKq -iKq -iKq -cNW -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaf +aaa +aaa +aaa +aaf +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaf +aaa +aaf +aaf +aaa +aaa +aaf +aaa +aaa +aoV +aaf +aaf +pEf +aaf +gXs +gXs +pEf +cNW +cNW +cNW +hib +cNW +iKq +iKq +iKq +cNW +cOe +cOe +cNW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa "} (213,1,1) = {" aaa @@ -128903,29 +129234,29 @@ aaf aaa aaa aaa -aag -aaa -aaa -aaa -aaa +aaf aaa -pEf aaa +aoV aaa aaa +aag +aaf aaa gXs +pEf +kAy +wEe +xgu +sHF +cNW +cNW +cNW cNW cNW cNW cNW -iKq -iKq -iKq -iKq -iKq cNW -aaa aaa aaa aaa @@ -129160,27 +129491,27 @@ aaf aaa aaa aaa -aag -aaa -aaa -aaa -aaa -aaa aaf aaa aaa aaa aaa aaa +pEf +aaf aaa -aaa -aaa -cNW -cNW +gXs +pEf cNW cNW cNW +cOe cNW +iKq +iKq +iKq +iKq +eoH cNW aaa aaa @@ -129423,22 +129754,22 @@ aaa aaa aaa aaa +pEf aaa aaa -aaa -aaa -aae -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs +gXs +gXs +cNW +cmo +cOe +vKX +iKq +iKq +iKq +iKq +iKq +cNW aaa aaa aaa @@ -129680,22 +130011,22 @@ aaa aaa aaa aaa +pEf aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aoV -aaa -aaa -aaa -aaa -aaa -aaa -aaa +gXs +cNW +cNW +cNW +cNW +iKq +iKq +iKq +iKq +iKq +cNW aaa aaa aaa @@ -129937,6 +130268,7 @@ aaa aaa aaa aaa +aaf aaa aaa aaa @@ -129945,14 +130277,13 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cNW +cNW +cNW +cNW +cNW +cNW +cNW aaa aaa aaa @@ -130188,7 +130519,7 @@ aaf aaa aaa aaa -aaf +aag aaa aaa aaa @@ -130198,11 +130529,11 @@ aaa aaa aaa aaa +aae aaa aaa aaa aaa -aoV aaa aaa aaa @@ -130441,12 +130772,11 @@ aaa aaa aaf aaa -aaf -aaa -aaa +rav aaa aaa aaa +irR aaa aaa aaa @@ -130460,6 +130790,7 @@ aaa aaa aaa aaa +aoV aaa aaa aaa @@ -130698,10 +131029,11 @@ aaa aaa aaf aaa -aaf +iqf aaa aaa aaa +aag aaa aaa aaa @@ -130716,7 +131048,6 @@ aaa aaa aaa aaa -aoV aaa aaa aaa diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 9f3dbc39c251..4c4189af722e 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2695,8 +2695,7 @@ "agB" = ( /obj/structure/window/reinforced/fulltile{ max_integrity = 5000; - name = "hardened window"; - obj_integrity = 5000 + name = "hardened window" }, /turf/open/floor/plating, /area/centcom/ctf) @@ -3746,9 +3745,9 @@ dir = 8; dwidth = 8; height = 7; - shuttle_id = "supply_away"; json_key = "cargo"; name = "CentCom"; + shuttle_id = "supply_away"; width = 20 }, /turf/open/space, @@ -4114,8 +4113,8 @@ area_type = /area/centcom/syndicate_mothership; dwidth = 25; height = 50; - shuttle_id = "emergency_syndicate"; name = "Syndicate Auxillary Shuttle Dock"; + shuttle_id = "emergency_syndicate"; width = 50 }, /turf/open/space/basic, @@ -7038,15 +7037,6 @@ /area/centcom/ferry) "apP" = ( /obj/structure/table/reinforced, -/obj/item/cartridge/quartermaster{ - pixel_x = -6 - }, -/obj/item/cartridge/quartermaster{ - pixel_x = 6 - }, -/obj/item/cartridge/quartermaster{ - pixel_y = 6 - }, /obj/item/gps/mining, /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -9218,9 +9208,9 @@ dir = 2; dwidth = 14; height = 13; - shuttle_id = "syndicatecutter_home"; name = "Syndicate Home Outpost"; roundstart_template = /datum/map_template/shuttle/infiltrator/cutter; + shuttle_id = "syndicatecutter_home"; width = 22 }, /turf/open/floor/plating/asteroid/snow/airless, @@ -9860,9 +9850,9 @@ dir = 4; dwidth = 25; height = 50; - shuttle_id = "emergency_away"; json_key = "emergency"; name = "CentCom Emergency Shuttle Dock"; + shuttle_id = "emergency_away"; width = 50 }, /turf/open/space, @@ -10654,8 +10644,8 @@ /obj/docking_port/stationary{ dwidth = 1; height = 4; - shuttle_id = "pod2_away"; name = "recovery ship"; + shuttle_id = "pod2_away"; width = 3 }, /turf/open/space/basic, @@ -10741,9 +10731,9 @@ dir = 8; dwidth = 2; height = 13; - shuttle_id = "ferry_away"; json_key = "ferry"; name = "CentCom Ferry Dock"; + shuttle_id = "ferry_away"; width = 5 }, /turf/open/space, @@ -12624,7 +12614,7 @@ /obj/effect/portal/permanent/one_way/multi/entry{ alpha = 55; color = "7D7D7D"; - desc = "for when the clock hits one thirty and keeps ticking..."; + desc = "For when the clock hits one thirty and keeps ticking..."; id = "testchamber"; name = "Test Chamber Portal"; teleport_channel = "quantum" @@ -12804,8 +12794,8 @@ /obj/docking_port/stationary{ dwidth = 1; height = 4; - shuttle_id = "pod3_away"; name = "recovery ship"; + shuttle_id = "pod3_away"; width = 3 }, /turf/open/space/basic, @@ -13943,8 +13933,8 @@ dir = 8; dwidth = 2; height = 7; - shuttle_id = "pod_away"; name = "recovery ship"; + shuttle_id = "pod_away"; width = 5 }, /turf/open/space/basic, @@ -14068,23 +14058,6 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/evac) -"aDy" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light{ - dir = 1; - light_color = "#c1caff" - }, -/turf/open/floor/plasteel, -/area/centcom/testchamber) "aDz" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -16102,20 +16075,6 @@ }, /turf/open/floor/plasteel/white, /area/centcom/tdome/tdomeobserve) -"aHy" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/vending/magivend, -/turf/open/floor/plasteel, -/area/centcom/testchamber) "aHz" = ( /obj/effect/turf_decal/caution/red, /turf/open/floor/plasteel/dark, @@ -18760,9 +18719,9 @@ dir = 8; dwidth = 12; height = 17; - shuttle_id = "syndicate_away"; name = "syndicate recon outpost"; roundstart_template = /datum/map_template/shuttle/infiltrator/basic; + shuttle_id = "syndicate_away"; width = 23 }, /turf/open/floor/engine, @@ -18786,21 +18745,6 @@ /obj/structure/table/reinforced, /turf/open/floor/plasteel, /area/centcom/testchamber) -"aMA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/kirbyplants/random, -/obj/item/throwing_star/ninja, -/turf/open/floor/plasteel, -/area/centcom/testchamber) "aMB" = ( /turf/open/indestructible/binary, /area/centcom/fabric_of_reality) @@ -18985,7 +18929,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/bluespace, /area/centcom/testchamber) "aMY" = ( @@ -19004,21 +18948,6 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) -"aMZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/chair, -/obj/item/soapstone/infinite, -/turf/open/floor/plasteel, -/area/centcom/testchamber) "aNa" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -21409,7 +21338,6 @@ /obj/item/dnainjector/hulkmut, /obj/item/dnainjector/insulated, /obj/item/dnainjector/lasereyesmut, -/obj/item/dnainjector/mindread, /obj/item/dnainjector/mutemut, /obj/item/dnainjector/olfaction, /obj/item/dnainjector/radioactive, @@ -21510,21 +21438,6 @@ icon_state = "white" }, /area/holodeck/rec_center/medical) -"aRX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/chair, -/obj/item/storage/briefcase/sniperbundle, -/turf/open/floor/plasteel, -/area/centcom/testchamber) "aRY" = ( /turf/open/floor/plasteel, /area/centcom/testchamber) @@ -21648,7 +21561,7 @@ /obj/effect/portal/permanent/one_way/multi/entry{ alpha = 55; color = "7D7D7D"; - desc = "for when the clock hits one thirty and keeps ticking..."; + desc = "For when the clock hits one thirty and keeps ticking..."; id = "testchamber"; name = "Test Chamber Portal"; teleport_channel = "quantum" @@ -22074,8 +21987,8 @@ dir = 4; dwidth = 1; height = 4; - shuttle_id = "pod4_away"; name = "recovery ship"; + shuttle_id = "pod4_away"; width = 3 }, /turf/open/space/basic, @@ -23417,7 +23330,7 @@ /turf/open/floor/plasteel, /area/centcom/testchamber) "aWb" = ( -/obj/machinery/portable_atmospherics/canister/toxins, +/obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/bluespace, /area/centcom/testchamber) "aWc" = ( @@ -23433,20 +23346,6 @@ }, /turf/open/floor/plasteel, /area/centcom/evac) -"aWd" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/vending/liberationstation, -/turf/open/floor/plasteel, -/area/centcom/testchamber) "aWe" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -23483,7 +23382,7 @@ /obj/effect/portal/permanent/one_way/multi/entry{ alpha = 55; color = "7D7D7D"; - desc = "for when the clock hits one thirty and keeps ticking..."; + desc = "For when the clock hits one thirty and keeps ticking..."; id = "testchamber"; name = "Test Chamber Portal"; teleport_channel = "quantum" @@ -24161,21 +24060,6 @@ }, /turf/open/floor/plasteel, /area/centcom/ferry) -"aXz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/kirbyplants/random, -/obj/item/switchblade, -/turf/open/floor/plasteel, -/area/centcom/testchamber) "aXA" = ( /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; @@ -24832,7 +24716,9 @@ }, /area/holodeck/rec_center/chapelcourt) "aYX" = ( -/obj/machinery/airalarm/directional/west, +/obj/machinery/airalarm/directional/west{ + pixel_x = -24 + }, /obj/machinery/light{ dir = 8 }, @@ -25488,6 +25374,12 @@ }, /turf/open/floor/engine, /area/centcom/syndicate_mothership) +"bQp" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/window/reinforced, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "bSb" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -25598,6 +25490,20 @@ }, /turf/open/floor/engine, /area/centcom/syndicate_mothership) +"cJM" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/window/reinforced, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) +"cNm" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/vending/liberationstation, +/turf/open/floor/plasteel, +/area/centcom/testchamber) "cOr" = ( /obj/effect/turf_decal/trimline/secred/filled/line/lower{ dir = 6 @@ -25616,6 +25522,15 @@ /obj/machinery/vending/sustenance, /turf/open/floor/plasteel/bluespace, /area/centcom) +"cSn" = ( +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/brflowers, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "cZw" = ( /turf/open/floor/plasteel, /area/centcom/supply) @@ -25743,6 +25658,12 @@ }, /turf/open/floor/plasteel/cafeteria, /area/centcom/syndicate_mothership) +"erk" = ( +/obj/structure/fluff/colton_statue{ + layer = 4.4 + }, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "evb" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -25754,6 +25675,11 @@ /obj/machinery/vending/cola/starkist, /turf/open/floor/plasteel/bluespace, /area/centcom) +"ewL" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "eDa" = ( /turf/open/indestructible/wiki/title{ icon_state = "title1" @@ -26036,6 +25962,24 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/centcom/ctf) +"hJg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/chair, +/obj/item/storage/briefcase/sniperbundle, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/centcom/testchamber) "hUh" = ( /obj/machinery/vending/sovietsoda, /turf/open/floor/plasteel/bluespace, @@ -26216,6 +26160,11 @@ }, /turf/open/floor/plasteel/dark, /area/centcom/syndicate_mothership) +"jZR" = ( +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "kaB" = ( /turf/open/indestructible/wiki/info{ icon_state = "64" @@ -26515,6 +26464,14 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"not" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/vending/magivend, +/turf/open/floor/plasteel, +/area/centcom/testchamber) "nuF" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -26781,6 +26738,11 @@ /obj/machinery/vending/wardrobe/cargo_wardrobe, /turf/open/floor/plasteel/bluespace, /area/centcom) +"pNt" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "pQy" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -26855,6 +26817,19 @@ /obj/machinery/vending/engivend, /turf/open/floor/plasteel/bluespace, /area/centcom) +"qSP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/closed/indestructible/riveted, +/area/centcom/tdome/tdomeadmin) "qSU" = ( /obj/machinery/vending/toyliberationstation, /turf/open/floor/plasteel/bluespace, @@ -26905,6 +26880,24 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/plasteel/dark, /area/yogs/infiltrator_base) +"rxZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/chair, +/obj/item/soapstone/infinite, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/centcom/testchamber) "rBK" = ( /obj/machinery/light/floor, /turf/open/floor/plasteel/dark, @@ -26983,6 +26976,11 @@ icon_state = "info10" }, /area/centcom/testchamber) +"tgb" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "tkz" = ( /obj/machinery/vending/liberationstation, /turf/open/floor/plasteel/bluespace, @@ -27207,6 +27205,12 @@ /obj/machinery/vending/wallmed, /turf/open/floor/plasteel/bluespace, /area/centcom) +"vjD" = ( +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/lavendergrass, +/obj/structure/window/reinforced, +/turf/open/floor/grass, +/area/centcom/tdome/tdomeadmin) "vpx" = ( /obj/structure/goalnet/goalpost/right, /turf/open/floor/holofloor/grass, @@ -70167,9 +70171,9 @@ aKa aJG aKr aIv -aIR -aIv -aMZ +aKA +aXX +rxZ aZr awS aBt @@ -70187,7 +70191,7 @@ aNt aNQ aNt aNt -auh +not awS aMk aAF @@ -70423,10 +70427,10 @@ aJQ aKa aJG aKc -aIR -aKA aIv -aMA +aIv +aIv +qSP aZr awS aBt @@ -70681,9 +70685,9 @@ aJG aJG aKs aIR -aKG -aIv -aHy +jZR +tgb +vjD aZr awS aBt @@ -70938,9 +70942,9 @@ aKb aJG aKt aKD -aIR -aIv -aDy +cSn +erk +bQp aMk awS add @@ -71195,9 +71199,9 @@ aJG aJG aKu aIR -aKG -aIv -aWd +ewL +pNt +cJM aZr awS aBt @@ -71451,10 +71455,10 @@ aJQ aKa aJG aKc -aIR -aKA aIv -aXz +aIv +aIv +qSP aZr awS aBt @@ -71709,9 +71713,9 @@ aKa aJG aKv aIv -aIR -aIv -aRX +aKG +aXX +hJg aZr awS aBt @@ -71729,7 +71733,7 @@ aNt aSt aNt aNt -auh +cNm awS aMk aAF diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index cc2bb08a7abe..c8e102b28568 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -45,7 +45,6 @@ #define THERMAL /datum/mutation/human/thermal #define ANTENNA /datum/mutation/human/antenna #define PARANOIA /datum/mutation/human/paranoia -#define MINDREAD /datum/mutation/human/mindreader #define INSULATED /datum/mutation/human/insulated #define SHOCKTOUCH /datum/mutation/human/shock #define SHOCKTOUCHFAR /datum/mutation/human/shock/far diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index f00b5431db9c..fd42046c46a9 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -92,6 +92,7 @@ #define ACCESS_SECURE_TECH_STORAGE 76 // Creating this to cleanly fix door remote bug will be equivalent to ACCESS_AI_UPLOAD for Cap and RD #define ACCESS_PSYCH 77 // For the psych's back office area with the flashes/chem machines #define ACCESS_RND 78 //rnd console +#define ACCESS_SERVHALL 79 //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 02afa775d1de..c0d71febaf39 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -86,6 +86,7 @@ #define ADMIN_PUNISHMENT_SCARIFY "Scarify" #define ADMIN_PUNISHMENT_SMSPIDER "SM Spider" #define ADMIN_PUNISHMENT_FLASHBANG "Flashbang" +#define ADMIN_PUNISHMENT_WIBBLY "Wibblify" #define AHELP_ACTIVE 1 #define AHELP_CLOSED 2 diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index e0d742e1ad66..aeb4b8434c94 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -4,15 +4,21 @@ ///Temperature limit of all AI machinery #define AI_TEMP_LIMIT 288.15 //15C, much hotter than a normal server room for leniency :) +///How long the AI can stay in the black-box before it's fully destroyed +#define AI_BLACKBOX_LIFETIME 300 +///How much CPU we need to use to revive the AI +#define AI_BLACKBOX_PROCESSING_REQUIREMENT 2500 + + #define AI_HEATSINK_CAPACITY 5000 #define AI_HEATSINK_COEFF 1 ///How many ticks can an AI data core store? When this amount of ticks have passed while it's in an INVALID state it can no longer be used by an AI -#define MAX_AI_DATA_CORE_TICKS 45 +#define MAX_AI_DATA_CORE_TICKS (45 * (20 / SSair.wait)) ///How much power does the AI date core use while being in a valid state. This is also the base heat output. (Divide by heat capacity to get actual temperature increase) #define AI_DATA_CORE_POWER_USAGE 7500 -///How many ticks can an expanion bus store. If it reaches 0 the resources will no longer be available. -#define MAX_AI_EXPANSION_TICKS 15 +///How many ticks can a server cabinet store. If it reaches 0 the resources will no longer be available. +#define MAX_AI_SERVER_CABINET_TICKS (15 * (20 / SSair.wait)) //AI Project Categories. @@ -21,6 +27,7 @@ #define AI_PROJECT_INDUCTION "Induction" #define AI_PROJECT_SURVEILLANCE "Surveillance" #define AI_PROJECT_EFFICIENCY "Efficiency" +#define AI_PROJECT_CROWD_CONTROL "Crowd Control" #define AI_PROJECT_MISC "Misc." //Update this list if you add any new ones, else the category won't show up in the UIs GLOBAL_LIST_INIT(ai_project_categories, list( @@ -29,9 +36,40 @@ GLOBAL_LIST_INIT(ai_project_categories, list( AI_PROJECT_SURVEILLANCE, AI_PROJECT_INDUCTION, AI_PROJECT_EFFICIENCY, + AI_PROJECT_CROWD_CONTROL, AI_PROJECT_MISC )) +//Synth Project Categories +#define SYNTH_PROJECT_MOBILITY "Mobility" +#define SYNTH_PROJECT_EMERGENCY_FUNCTIONS "Emergency Functions" +#define SYNTH_PROJECT_MISC "Misc." +//Update this list if you add any new ones, else the category won't show up in the UIs +GLOBAL_LIST_INIT(synth_project_categories, list( + SYNTH_PROJECT_MOBILITY, + SYNTH_PROJECT_EMERGENCY_FUNCTIONS, + SYNTH_PROJECT_MISC +)) + +#define SYNTH_DAMAGED "damage to own synthetic shell" +#define SYNTH_RESTRICTED_ITEM "usage of restricted weapon" +#define SYNTH_OBJ_DAMAGE "damage to inanimate object" +#define SYNTH_RESTRICTED_WEAPON "usage of restricted weapon" +#define SYNTH_ORGANIC_HARM "harm to organic being" + +GLOBAL_LIST_INIT(synth_punishment_values, list( + "[SYNTH_DAMAGED]" = 1, + "[SYNTH_RESTRICTED_ITEM]" = 5, + "[SYNTH_OBJ_DAMAGE]" = 5, + "[SYNTH_RESTRICTED_WEAPON]" = 10, + "[SYNTH_ORGANIC_HARM]" = 15, +)) + +//Synth Governor Defines +//How fast the governor suspicion decreases +#define SYNTH_GOVERNOR_SUSPICION_DECREASE 0.05 + + ///How much is the AI download progress increased by per tick? Multiplied by a modifer on the AI if they have upgraded. Need to reach 100 to be downloaded #define AI_DOWNLOAD_PER_PROCESS 1.125 ///Check for tracked individual coming into view every X ticks @@ -56,10 +94,54 @@ GLOBAL_LIST_INIT(ai_project_categories, list( //Self explanatory. 1 bitcoin is equals to 1 CPU * AI_RESEARCH_PER_CPU -//EXAMPLE (with initial values as of feature introduction) -//20 free CPU. 10 are used for research, 10 are used for bitcoin -//10 * AI_RESEARCH_PER_CPU = 85 bitcoin per tick. Modified for scaling 85*0.54=46 -//46 * AI_BITCOIN_PRICE = 2,3 credits per 2 seconds (2070 credits per 30 min) -#define MAX_AI_BITCOIN_MINED_PER_TICK 350 -//Self explanatory, see MAX_AI_BITCOIN_MINED_PER_TICK * this = max money 1 AI can contribute per tick. (17,5 credits every 2 seconds, max 63k over 2 hours) -#define AI_BITCOIN_PRICE 0.05 +#define MAX_AI_BITCOIN_MINED_PER_TICK 250 +//Self explanatory, see MAX_AI_BITCOIN_MINED_PER_TICK * this = max money 1 network can contribute per tick. (17,5 credits every 2 seconds, max 63k over 2 hours) +#define AI_BITCOIN_PRICE 0.025 + + +//Self explanatory. 1 point is equals to 1 CPU * AI_RESEARCH_PER_CPU. Higher value = can use more CPU and get benefits +#define MAX_AI_REGULAR_RESEARCH_PER_TICK 500 +//Self explanatory. Lower value = more CPU equals less points. Station makes approx. 56 points per tick. This results in 25 (50% gain) +#define AI_REGULAR_RESEARCH_POINT_MULTIPLIER 0.05 + + +//How much RAM and CPU a core needs locally to be functional +#define AI_CORE_CPU_REQUIREMENT 1 +#define AI_CORE_RAM_REQUIREMENT 1 + +//For network based research and tasks. Since each network are going to contribute to a "global" pool of research there's no point in making this more complicated or modular +//Adding an entry here automatically adds it to the UI and allows CPU to be allocated. Just use your define in the network process() to do stuff +#define AI_CRYPTO "Cryptocurrency Mining" +#define AI_RESEARCH "Research Assistance" +#define AI_REVIVAL "AI Restoration" +#define AI_PUZZLE "Floppy Drive Decryption" +#define SYNTH_RESEARCH "Synth Research Allocation" + +GLOBAL_LIST_INIT(possible_ainet_activities, list( + "[AI_CRYPTO]", + "[AI_RESEARCH]", + "[AI_REVIVAL]", + "[AI_PUZZLE]", + "[SYNTH_RESEARCH]" +)) + +GLOBAL_LIST_INIT(ainet_activity_tagline, list( + "[AI_CRYPTO]" = "Use CPU to generate credits!", + "[AI_RESEARCH]" = "Use CPU to generate regular research points!", + "[AI_REVIVAL]" = "Revive a dead AI using CPU!", + "[AI_PUZZLE]" = "Use CPU to break encryption on floppy drives!", + "[SYNTH_RESEARCH]" = "Give connected synths CPU for research!" +)) + +GLOBAL_LIST_INIT(ainet_activity_description, list( + "[AI_CRYPTO]" = "Using CPU to mine NTCoin should allow for a meager sum of passive credit income.", + "[AI_RESEARCH]" = "Allocating additional CPU to the research servers should allow for increased point gain. Not to be confused with AI Research points.", + "[AI_REVIVAL]" = "If you've inserted a volatile neural core into a connected data core this will revive it using CPU.", + "[AI_PUZZLE]" = "If you've found and inserted an encrypted floppy drive into a connected server cabinet you can decrypt it using CPU.", + "[SYNTH_RESEARCH]" = "CPU allocated to this task will be split amongst connected synths so they can research local projects." +)) + + +//Exploration defines +#define AI_FLOPPY_DECRYPTION_COST 2500 +#define AI_FLOPPY_EXPONENT 1.25 diff --git a/code/__DEFINES/ammo.dm b/code/__DEFINES/ammo.dm index 2de4adfd21af..054698eb5d6a 100644 --- a/code/__DEFINES/ammo.dm +++ b/code/__DEFINES/ammo.dm @@ -1,34 +1,35 @@ /// Caliber defines /// Guns -#define CALIBER_10MM "10mm" // 10mm Auto (Stechkin) -#define CALIBER_12GA "shotgun" // 12 Gauge (Shotguns) -#define CALIBER_308 "m308" // .308 Winchester (Winton Mk. VI Repeating Rifle, LWT-650 DMR) -#define CALIBER_310 "310" // .310 Cadet (Lionhunter's Rifle) -#define CALIBER_32ACP "32trac" // .32 ACP (Caldwell Tracking Revolver) -#define CALIBER_357MAG "357" // .357 Magnum (Revolver) -#define CALIBER_38 "38" // .38 Special (Detective Revolver) -#define CALIBER_40GL "40mm" // 40x46mm LV (Grenade Launchers) -#define CALIBER_44MAG "44" // .44 Magnum (Unica 6 autorevolver) -#define CALIBER_45ACP ".45" // .45 ACP (M1911, Surplus Carbine, C20r) -#define CALIBER_46X30 "4.6x30mm" // HK 4.6x30mm (WT-550) -#define CALIBER_50AE ".50ae" // .50 Action Express (Desert Eagle) -#define CALIBER_50BMG ".50bmg" // .50 BMG (Sniper Rifle) -#define CALIBER_546MM "a546" // 5.46mm (Osprey Minigun) -#define CALIBER_556NATO "a556" // 5.56x45mm NATO (NT-ARG, M-90gl) -#define CALIBER_712X82 "mm71282" // 7.12x82mm (L6 SAW) -#define CALIBER_75 ".75" // .75 caliber (Imperial Bolt Pistol) -#define CALIBER_75GYRO "75" // 75mm rocket (Gyrojet Pistol) -#define CALIBER_762X38R "n762" // 7.62x38mmR (Nagant Revolver) -#define CALIBER_762X54R "a762" // 7.62x54mmR (Nagant Rifle) -#define CALIBER_84HE "84mm" // 84mm anti-tank (Rocket Launcher) -#define CALIBER_9X19 "9mm" // 9x19mm Parabellum (Stechkin APS, Uzi) -#define CALIBER_BREACH "breaching" // 12 Gauge (Breaching Shotgun) -#define CALIBER_CANNON "100mm" // Cannonball (Hand Cannon) -#define CALIBER_FOAM "foam_force" // Foam darts (Toy Guns) -#define CALIBER_GATLING "gatling" // Gatling (Osprey Minigun) (Don't ask) -#define CALIBER_SPEAR "speargun" // Spear (Speargun) +#define CALIBER_10MM "10mm" // 10mm Auto (Stechkin) +#define CALIBER_12GA "shotgun" // 12 Gauge (Shotguns) +#define CALIBER_308 "m308" // .308 Winchester (Winton Mk. VI Repeating Rifle, LWT-650 DMR) +#define CALIBER_310 "310" // .310 Cadet (Lionhunter's Rifle) +#define CALIBER_32ACP "32trac" // .32 ACP (Caldwell Tracking Revolver) +#define CALIBER_357MAG "357" // .357 Magnum (Revolver) +#define CALIBER_38 "38" // .38 Special (Detective Revolver) +#define CALIBER_40GL "40mm" // 40x46mm LV (Grenade Launchers) +#define CALIBER_44MAG "44" // .44 Magnum (Unica 6 autorevolver) +#define CALIBER_45ACP ".45" // .45 ACP (M1911, Surplus Carbine, C20r) +#define CALIBER_46X30 "4.6x30mm" // HK 4.6x30mm (WT-550) +#define CALIBER_50AE ".50ae" // .50 Action Express (Desert Eagle) +#define CALIBER_50BMG ".50bmg" // .50 BMG (Sniper Rifle) +#define CALIBER_546MM "a546" // 5.46mm (Osprey Minigun) +#define CALIBER_556NATO "a556" // 5.56x45mm NATO (NT-ARG, M-90gl) +#define CALIBER_712X82 "mm71282" // 7.12x82mm (L6 SAW) +#define CALIBER_75 ".75" // .75 caliber (Imperial Bolt Pistol) +#define CALIBER_75GYRO "75" // 75mm rocket (Gyrojet Pistol) +#define CALIBER_762X38R "n762" // 7.62x38mmR (Nagant Revolver) +#define CALIBER_762X54R "a762" // 7.62x54mmR (Nagant Rifle) +#define CALIBER_84HE "84mm" // 84mm anti-tank (Rocket Launcher) +#define CALIBER_9X19 "9mm" // 9x19mm Parabellum (Stechkin APS, Uzi) +#define CALIBER_BREACH "breaching" // 12 Gauge (Breaching Shotgun) +#define CALIBER_CANNON "100mm" // Cannonball (Hand Cannon) +#define CALIBER_FOAM "foam_force" // Foam darts (Toy Guns) +#define CALIBER_FOAM_RIOT "foam_force_riot" // Riot darts (Syndicate Toy Guns) +#define CALIBER_GATLING "gatling" // Gatling (Osprey Minigun) (Don't ask) +#define CALIBER_SPEAR "speargun" // Spear (Speargun) /// Magic and other esoteric non-gun stuff -#define CALIBER_ARROW "arrow" // Bows -#define CALIBER_HOOK "hook" // Meat hook and other hooks -#define CALIBER_TENTACLE "tentacle" // Ling tentacle +#define CALIBER_ARROW "arrow" // Bows +#define CALIBER_HOOK "hook" // Meat hook and other hooks +#define CALIBER_TENTACLE "tentacle" // Ling tentacle diff --git a/code/__DEFINES/cleaning.dm b/code/__DEFINES/cleaning.dm index 365cd09a58ec..9d99384337cf 100644 --- a/code/__DEFINES/cleaning.dm +++ b/code/__DEFINES/cleaning.dm @@ -34,3 +34,8 @@ #define CLEAN_SCRUB (CLEAN_WASH | CLEAN_TYPE_FINGERPRINTS | CLEAN_TYPE_FIBERS | CLEAN_TYPE_HARD_DECAL) #define CLEAN_RAD CLEAN_TYPE_RADIATION #define CLEAN_ALL (ALL & ~CLEAN_TYPE_WEAK) + +// Footprint sprites to use when making footprints in blood, oil, etc. +#define FOOTPRINT_SPRITE_SHOES "shoes" +#define FOOTPRINT_SPRITE_PAWS "paws" +#define FOOTPRINT_SPRITE_CLAWS "claws" diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index f69b8c13b4d2..7e566a6a2ab9 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -266,10 +266,27 @@ #define CIRCUIT_COLOR_SECURITY "#9A151E" #define CIRCUIT_COLOR_SCIENCE "#BC4A9B" #define CIRCUIT_COLOR_SERVICE "#92DCBA" -#define CIRCUIT_COLOR_MEDICAL "#00CCFF" -#define CIRCUIT_COLOR_ENGINEERING "#F8D700" +#define CIRCUIT_COLOR_MEDICAL "#1994E1" +#define CIRCUIT_COLOR_ENGINEERING "#DBC21F" #define CIRCUIT_COLOR_SUPPLY "#C47749" - +#define CABLE_COLOR_BLUE "blue" + #define CABLE_HEX_COLOR_BLUE COLOR_STRONG_BLUE +#define CABLE_COLOR_BROWN "brown" + #define CABLE_HEX_COLOR_BROWN COLOR_ORANGE_BROWN +#define CABLE_COLOR_CYAN "cyan" + #define CABLE_HEX_COLOR_CYAN COLOR_CYAN +#define CABLE_COLOR_GREEN "green" + #define CABLE_HEX_COLOR_GREEN COLOR_DARK_LIME +#define CABLE_COLOR_ORANGE "orange" + #define CABLE_HEX_COLOR_ORANGE COLOR_MOSTLY_PURE_ORANGE +#define CABLE_COLOR_PINK "pink" + #define CABLE_HEX_COLOR_PINK COLOR_LIGHT_PINK +#define CABLE_COLOR_RED "red" + #define CABLE_HEX_COLOR_RED COLOR_RED +#define CABLE_COLOR_WHITE "white" + #define CABLE_HEX_COLOR_WHITE COLOR_WHITE +#define CABLE_COLOR_YELLOW "yellow" + #define CABLE_HEX_COLOR_YELLOW COLOR_YELLOW /// Colors for pride week #define COLOR_PRIDE_RED "#FF6666" #define COLOR_PRIDE_ORANGE "#FC9F3C" @@ -296,25 +313,6 @@ #define COLOR_CHANGELING_CHEMICALS "#DD66DD" #define COLOR_DARKSPAWN_PSI "#7264FF" -#define CABLE_COLOR_BLUE "blue" - #define CABLE_HEX_COLOR_BLUE COLOR_STRONG_BLUE -#define CABLE_COLOR_BROWN "brown" - #define CABLE_HEX_COLOR_BROWN COLOR_ORANGE_BROWN -#define CABLE_COLOR_CYAN "cyan" - #define CABLE_HEX_COLOR_CYAN COLOR_CYAN -#define CABLE_COLOR_GREEN "green" - #define CABLE_HEX_COLOR_GREEN COLOR_DARK_LIME -#define CABLE_COLOR_ORANGE "orange" - #define CABLE_HEX_COLOR_ORANGE COLOR_MOSTLY_PURE_ORANGE -#define CABLE_COLOR_PINK "pink" - #define CABLE_HEX_COLOR_PINK COLOR_LIGHT_PINK -#define CABLE_COLOR_RED "red" - #define CABLE_HEX_COLOR_RED COLOR_RED -#define CABLE_COLOR_WHITE "white" - #define CABLE_HEX_COLOR_WHITE COLOR_WHITE -#define CABLE_COLOR_YELLOW "yellow" - #define CABLE_HEX_COLOR_YELLOW COLOR_YELLOW - #define COLOR_CARP_PURPLE "#aba2ff" #define COLOR_CARP_PINK "#da77a8" #define COLOR_CARP_GREEN "#70ff25" diff --git a/code/__DEFINES/construction/material.dm b/code/__DEFINES/construction/material.dm index 294fe6364cd5..7fc5a8b13f2b 100644 --- a/code/__DEFINES/construction/material.dm +++ b/code/__DEFINES/construction/material.dm @@ -12,7 +12,7 @@ /// The maximum size of a stack object. #define MAX_STACK_SIZE 50 /// Maximum amount of cable in a coil -#define MAXCOIL 30 +#define MAXCOIL 40 //Category of materials /// Is the material from an ore? currently unused but exists atm for categorizations sake @@ -40,17 +40,6 @@ ///If the user won't receive a warning when attacking the container with an unallowed item. #define MATCONTAINER_SILENT (1<<3) -/// Whether a material's mechanical effects should apply to the atom. This is necessary for other flags to work. -#define MATERIAL_EFFECTS (1<<0) -/// Applies the material color to the atom's color. Deprecated, use MATERIAL_GREYSCALE instead -#define MATERIAL_COLOR (1<<1) -/// Whether a prefix describing the material should be added to the name -#define MATERIAL_ADD_PREFIX (1<<2) -/// Whether a material should affect the stats of the atom -#define MATERIAL_AFFECT_STATISTICS (1<<3) -/// Applies the material greyscale color to the atom's greyscale color. -#define MATERIAL_GREYSCALE (1<<4) - //Special return values of [/datum/component/material_container/insert_item] /// No material was found inside them item #define MATERIAL_INSERT_ITEM_NO_MATS -1 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index 1a8b34433436..c00e622515fc 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -3,9 +3,9 @@ // All signals send the source datum of the signal as the first argument ///from base of atom/attackby(): (/obj/item, /mob/living, params) -#define COMSIG_PARENT_ATTACKBY "atom_attackby" +#define COMSIG_ATOM_ATTACKBY "atom_attackby" /// From base of [atom/proc/attacby_secondary()]: (/obj/item/weapon, /mob/user, params) -#define COMSIG_PARENT_ATTACKBY_SECONDARY "atom_attackby_secondary" +#define COMSIG_ATOM_ATTACKBY_SECONDARY "atom_attackby_secondary" /// From base of [/atom/proc/attack_hand_secondary]: (mob/user, list/modifiers) - Called when the atom receives a secondary unarmed attack. #define COMSIG_ATOM_ATTACK_HAND_SECONDARY "atom_attack_hand_secondary" ///Return this in response if you don't want afterattack to be called diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 4f56824b5e4a..188297594d37 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -100,6 +100,9 @@ /// from cosmetic items to restyle certain mobs, objects or organs: (atom/source, mob/living/trimmer, atom/movable/original_target, body_zone, restyle_type, style_speed) #define COMSIG_ATOM_RESTYLE "atom_restyle" +/// Called on [/atom/SpinAnimation()] : (speed, loops, segments, angle) +#define COMSIG_ATOM_SPIN_ANIMATION "atom_spin_animation" + ///! from proc/get_rad_contents(): () #define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" #define COMPONENT_BLOCK_RADIATION 1 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index 45be2ed4f984..44278be89e13 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -94,6 +94,7 @@ /// from base of atom/movable/Process_Spacemove(): (movement_dir, continuous_move) #define COMSIG_MOVABLE_SPACEMOVE "spacemove" #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0) + #define COMSIG_MOVABLE_ALLOW_SPACEMOVE (1<<1) /// Sent from /obj/item/radio/talk_into(): (obj/item/radio/used_radio) #define COMSIG_MOVABLE_USING_RADIO "movable_radio" diff --git a/code/__DEFINES/dcs/signals/signals_greyscale.dm b/code/__DEFINES/dcs/signals/signals_greyscale.dm new file mode 100644 index 000000000000..b3192760cd7e --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_greyscale.dm @@ -0,0 +1 @@ +#define COMSIG_GREYSCALE_CONFIG_REFRESHED "greyscale_config_refreshed" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 836b08a8071f..273ceaeeded4 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -147,6 +147,11 @@ #define COMSIG_ITEM_HIT_REACT "item_hit_react" #define COMPONENT_HIT_REACTION_BLOCK (1<<0) +/// from /datum/component/cleave_attack/perform_sweep(): (atom/target, obj/item/item, mob/living/user, params) +#define COMSIG_ATOM_CLEAVE_ATTACK "atom_cleave_attack" + // allows cleave attack to hit things it normally wouldn't + #define ATOM_ALLOW_CLEAVE_ATTACK (1<<0) + /// Called before an item is embedded (mob/living/carbon/target = carbon that it is getting embedded into) #define COMSIG_ITEM_EMBEDDED "mob_carbon_embedded" // Prevents the embed @@ -185,6 +190,8 @@ #define COMPONENT_OFFER_TAKE_INTERRUPT (1<<0) /// sent from obj/effect/attackby(): (/obj/effect/hit_effect, /mob/living/attacker, params) #define COMSIG_ITEM_ATTACK_EFFECT "item_effect_attacked" +/// Called by /obj/item/proc/worn_overlays(list/overlays, mutable_appearance/standing, isinhands, icon_file) +#define COMSIG_ITEM_GET_WORN_OVERLAYS "item_get_worn_overlays" /// for tc refunding items: (mob/living/user); returns TRUE if refund is allowed, FALSE if not. #define COMSIG_ITEM_REFUND "item_refund" diff --git a/code/__DEFINES/exosuit_fab.dm b/code/__DEFINES/exosuit_fab.dm index d0b26efacad9..ab3e7b453414 100644 --- a/code/__DEFINES/exosuit_fab.dm +++ b/code/__DEFINES/exosuit_fab.dm @@ -15,21 +15,19 @@ #define EXOSUIT_MODULE_RIPLEY (1<<0) /// Module is compatible with Odyseeus Exosuit models #define EXOSUIT_MODULE_ODYSSEUS (1<<1) -/// Module is compatible with Firefighter Exosuit models -#define EXOSUIT_MODULE_FIREFIGHTER (1<<2) /// Module is compatible with Gygax Exosuit models -#define EXOSUIT_MODULE_GYGAX (1<<3) +#define EXOSUIT_MODULE_GYGAX (1<<2) /// Module is compatible with Durand Exosuit models -#define EXOSUIT_MODULE_DURAND (1<<4) +#define EXOSUIT_MODULE_DURAND (1<<3) /// Module is compatible with H.O.N.K Exosuit models -#define EXOSUIT_MODULE_HONK (1<<5) +#define EXOSUIT_MODULE_HONK (1<<4) /// Module is compatible with Phazon Exosuit models -#define EXOSUIT_MODULE_PHAZON (1<<6) +#define EXOSUIT_MODULE_PHAZON (1<<5) /// Module is compatible with Sidewinder Exosuit models -#define EXOSUIT_MODULE_SIDEWINDER (1<<7) +#define EXOSUIT_MODULE_SIDEWINDER (1<<6) /// Module is compatible with "Working" Exosuit models - Ripley and Firefighter -#define EXOSUIT_MODULE_WORKING EXOSUIT_MODULE_RIPLEY | EXOSUIT_MODULE_FIREFIGHTER +#define EXOSUIT_MODULE_WORKING EXOSUIT_MODULE_RIPLEY /// Module is compatible with "Combat" Exosuit models - Gygax, H.O.N.K, Durand, Phazon, and Sidewinder #define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON | EXOSUIT_MODULE_SIDEWINDER /// Module is compatible with "Medical" Exosuit modelsm - Odysseus diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 0586b90352b9..93811084f6c4 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -42,6 +42,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NODECONSTRUCT_1 (1<<7) /// Prevent clicking things below it on the same turf eg. doors/ fulltile windows #define PREVENT_CLICK_UNDER_1 (1<<9) +/// Can players recolor this in-game via vendors (and maybe more if support is added)? +#define IS_PLAYER_COLORABLE_1 (1<<10) /// TESLA_IGNORE grants immunity from being targeted by tesla-style electricity #define TESLA_IGNORE_1 (1<<11) /// If a turf can be made dirty at roundstart. This is also used in areas. @@ -197,6 +199,21 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define AA_TARGET_SEE_APPEARANCE (1<<0) #define AA_MATCH_TARGET_OVERLAYS (1<<1) +#define KEEP_TOGETHER_ORIGINAL "keep_together_original" + +//setter for KEEP_TOGETHER to allow for multiple sources to set and unset it +#define ADD_KEEP_TOGETHER(x, source)\ + if ((x.appearance_flags & KEEP_TOGETHER) && !HAS_TRAIT(x, TRAIT_KEEP_TOGETHER)) ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL); \ + ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\ + x.appearance_flags |= KEEP_TOGETHER + +#define REMOVE_KEEP_TOGETHER(x, source)\ + REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\ + if(HAS_TRAIT_FROM_ONLY(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL))\ + REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL);\ + else if(!HAS_TRAIT(x, TRAIT_KEEP_TOGETHER))\ + x.appearance_flags &= ~KEEP_TOGETHER + //religious_tool flags #define RELIGION_TOOL_INVOKE (1<<0) #define RELIGION_TOOL_SACRIFICE (1<<1) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index f8f9e3ff4819..c6e89f697d68 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -90,8 +90,10 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ispreternis(A) (is_species(A,/datum/species/preternis)) #define isszlachta(A) (is_species(A, /datum/species/szlachta)) #define isipc(A) (is_species(A, /datum/species/ipc)) +#define isinsurgent(A) (is_species(A, /datum/species/ipc/self/insurgent)) #define issnail(A) (is_species(A, /datum/species/snail)) #define isandroid(A) (is_species(A, /datum/species/android)) +#define is_synth(A) (is_species(A,/datum/species/wy_synth)) #define isdummy(A) (istype(A, /mob/living/carbon/human/dummy)) //more carbon mobs diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 5e23be25f41a..f6344769e880 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -22,37 +22,38 @@ #define JOB_DISPLAY_ORDER_CHIEF_ENGINEER 7 #define JOB_DISPLAY_ORDER_STATION_ENGINEER 8 #define JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN 9 -#define JOB_DISPLAY_ORDER_NETWORK_ADMIN 10 -#define JOB_DISPLAY_ORDER_AI 11 -#define JOB_DISPLAY_ORDER_CYBORG 12 +#define JOB_DISPLAY_ORDER_AI 10 +#define JOB_DISPLAY_ORDER_CYBORG 11 +#define JOB_DISPLAY_ORDER_SYNTHETIC 12 #define JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR 13 #define JOB_DISPLAY_ORDER_SCIENTIST 14 #define JOB_DISPLAY_ORDER_ROBOTICIST 15 -#define JOB_DISPLAY_ORDER_QUARTERMASTER 16 -#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 17 -#define JOB_DISPLAY_ORDER_SHAFT_MINER 18 -#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 19 -#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 20 -#define JOB_DISPLAY_ORDER_CHEMIST 21 -#define JOB_DISPLAY_ORDER_GENETICIST 22 -#define JOB_DISPLAY_ORDER_VIROLOGIST 23 -#define JOB_DISPLAY_ORDER_MINING_MEDIC 24 -#define JOB_DISPLAY_ORDER_PARAMEDIC 25 -#define JOB_DISPLAY_ORDER_PSYCHIATRIST 26 -#define JOB_DISPLAY_ORDER_BRIG_PHYSICIAN 27 -#define JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL 28 -#define JOB_DISPLAY_ORDER_BARTENDER 29 -#define JOB_DISPLAY_ORDER_COOK 30 -#define JOB_DISPLAY_ORDER_BOTANIST 31 -#define JOB_DISPLAY_ORDER_JANITOR 32 -#define JOB_DISPLAY_ORDER_CLOWN 33 -#define JOB_DISPLAY_ORDER_MIME 34 -#define JOB_DISPLAY_ORDER_CURATOR 35 -#define JOB_DISPLAY_ORDER_LAWYER 36 -#define JOB_DISPLAY_ORDER_ARTIST 37 -#define JOB_DISPLAY_ORDER_TOURIST 38 -#define JOB_DISPLAY_ORDER_CLERK 39 -#define JOB_DISPLAY_ORDER_CHAPLAIN 40 +#define JOB_DISPLAY_ORDER_NETWORK_ADMIN 16 +#define JOB_DISPLAY_ORDER_QUARTERMASTER 17 +#define JOB_DISPLAY_ORDER_CARGO_TECHNICIAN 18 +#define JOB_DISPLAY_ORDER_SHAFT_MINER 19 +#define JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER 20 +#define JOB_DISPLAY_ORDER_MEDICAL_DOCTOR 21 +#define JOB_DISPLAY_ORDER_CHEMIST 22 +#define JOB_DISPLAY_ORDER_GENETICIST 23 +#define JOB_DISPLAY_ORDER_VIROLOGIST 24 +#define JOB_DISPLAY_ORDER_MINING_MEDIC 25 +#define JOB_DISPLAY_ORDER_PARAMEDIC 26 +#define JOB_DISPLAY_ORDER_PSYCHIATRIST 27 +#define JOB_DISPLAY_ORDER_BRIG_PHYSICIAN 28 +#define JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL 29 +#define JOB_DISPLAY_ORDER_BARTENDER 30 +#define JOB_DISPLAY_ORDER_COOK 31 +#define JOB_DISPLAY_ORDER_BOTANIST 32 +#define JOB_DISPLAY_ORDER_JANITOR 33 +#define JOB_DISPLAY_ORDER_CLOWN 34 +#define JOB_DISPLAY_ORDER_MIME 35 +#define JOB_DISPLAY_ORDER_CURATOR 36 +#define JOB_DISPLAY_ORDER_LAWYER 37 +#define JOB_DISPLAY_ORDER_ARTIST 38 +#define JOB_DISPLAY_ORDER_TOURIST 39 +#define JOB_DISPLAY_ORDER_CLERK 40 +#define JOB_DISPLAY_ORDER_CHAPLAIN 41 #define DEPARTMENT_UNASSIGNED "No Department" #define DEPARTMENT_BITFLAG_SECURITY (1<<0) diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index b333b7f18059..b8cb957f14db 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -24,4 +24,5 @@ #define LANGUAGE_VOICECHANGE "voicechange" #define LANGUAGE_REVOLUTIONARY "revolutionary" #define LANGUAGE_CATEARS "cat" +#define LANGUAGE_SYNTH "synth" #define LANGUAGE_MULTILINGUAL "multilingual" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 1ba6879005b8..9523a88a6a69 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -132,7 +132,7 @@ #define HIGH_TURF_LAYER 2.03 #define LATTICE_LAYER 2.04 #define DISPOSAL_PIPE_LAYER 2.042 -#define WIRE_LAYER 2.044 +#define ETHERNET_LAYER 2.043 #define GLASS_FLOOR_LAYER 2.046 #define TRAM_RAIL_LAYER 2.047 #define ABOVE_OPEN_TURF_LAYER 2.049 @@ -144,6 +144,7 @@ #define BULLET_HOLE_LAYER 2.06 #define ABOVE_NORMAL_TURF_LAYER 2.08 #define GAS_PIPE_HIDDEN_LAYER 2.35 //layer = initial(layer) + piping_layer / 1000 in atmospherics/update_icon() to determine order of pipe overlap +#define WIRE_LAYER 2.43 //Yog Biome request #define WIRE_BRIDGE_LAYER 2.44 #define WIRE_TERMINAL_LAYER 2.45 #define GAS_SCRUBBER_LAYER 2.46 @@ -180,9 +181,9 @@ //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define #define CLOSED_DOOR_LAYER 3.1 #define CLOSED_FIREDOOR_LAYER 3.11 +#define SHUTTER_LAYER 3.12 // HERE BE DRAGONS +#define CLOSED_BLASTDOOR_LAYER 3.13 // ABOVE DOORS #define ABOVE_OBJ_LAYER 3.2 -#define CLOSED_BLASTDOOR_LAYER 3.3 // ABOVE WINDOWS AND DOORS -#define SHUTTER_LAYER 3.3 // HERE BE DRAGONS #define ABOVE_WINDOW_LAYER 3.3 #define SIGN_LAYER 3.4 #define CORGI_ASS_PIN_LAYER 3.41 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index a46bd0b2fa88..9d0efd909944 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -56,6 +56,7 @@ #define MC_CHARGE "CHARGE" #define MC_AI "AI" #define MC_SENSORS "SENSORS" +#define MC_AI_NETWORK "AINETWORK" //NTNet stuff, for modular computers // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc) diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index 6b4f6ae436c0..a0db9510a296 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -1,5 +1,18 @@ /// Gets the reference for the material type that was given #define getmaterialref(A) (SSmaterials.materials[A]) -/// Flag for atoms, this flag ensures it isn't re-colored by materials. Useful for snowflake icons such as default toolboxes. -#define MATERIAL_NO_COLOR (1<<0) +/// Whether a material's mechanical effects should apply to the atom. This is necessary for other flags to work. +#define MATERIAL_EFFECTS (1<<0) +/// Applies the material color to the atom's color. Deprecated, use MATERIAL_GREYSCALE instead +#define MATERIAL_COLOR (1<<1) +/// Whether a prefix describing the material should be added to the name +#define MATERIAL_ADD_PREFIX (1<<2) +/// Whether a material should affect the stats of the atom +#define MATERIAL_AFFECT_STATISTICS (1<<3) +/// Applies the material greyscale color to the atom's greyscale color. +#define MATERIAL_GREYSCALE (1<<4) + +/// Wrapper for fetching material references. Exists exclusively so that people don't need to wrap everything in a list every time. +#define GET_MATERIAL_REF(arguments...) SSmaterials._GetMaterialRef(list(##arguments)) + +#define MATERIAL_SOURCE(mat) "[mat.name]_material" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 5817688c2ae3..17975df42978 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -314,6 +314,13 @@ #define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default. #define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism +// Eye protection +#define FLASH_PROTECTION_HYPER_SENSITIVE -2 +#define FLASH_PROTECTION_SENSITIVE -1 +#define FLASH_PROTECTION_NONE 0 +#define FLASH_PROTECTION_FLASH 1 +#define FLASH_PROTECTION_WELDER 2 + // Roundstart trait system #define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart @@ -392,3 +399,39 @@ /// Possible value of [/atom/movable/buckle_lying]. If set to a different (positive-or-zero) value than this, the buckling thing will force a lying angle on the buckled. #define NO_BUCKLE_LYING -1 + +/// Squashing will not occur if the mob is not lying down (bodyposition is LYING_DOWN) +#define SQUASHED_SHOULD_BE_DOWN (1<<0) +/// If present, outright gibs the squashed mob instead of just dealing damage +#define SQUASHED_SHOULD_BE_GIBBED (1<<1) +/// If squashing always passes if the mob is dead +#define SQUASHED_ALWAYS_IF_DEAD (1<<2) +/// Don't squash our mob if its not located in a turf +#define SQUASHED_DONT_SQUASH_IN_CONTENTS (1<<3) + +// Bitflags for mob dismemberment and gibbing +/// Mobs will drop a brain +#define DROP_BRAIN (1<<0) +/// Mobs will drop organs +#define DROP_ORGANS (1<<1) +/// Mobs will drop bodyparts (arms, legs, etc.) +#define DROP_BODYPARTS (1<<2) +/// Mobs will drop items +#define DROP_ITEMS (1<<3) + +/// Mobs will drop everything +#define DROP_ALL_REMAINS (DROP_BRAIN | DROP_ORGANS | DROP_BODYPARTS | DROP_ITEMS) + +// Sprites for photocopying butts +#define BUTT_SPRITE_HUMAN_MALE "human_male" +#define BUTT_SPRITE_HUMAN_FEMALE "human_female" +#define BUTT_SPRITE_LIZARD "lizard" +#define BUTT_SPRITE_QR_CODE "qr_code" +#define BUTT_SPRITE_XENOMORPH "xeno" +#define BUTT_SPRITE_DRONE "drone" +#define BUTT_SPRITE_CAT "cat" +#define BUTT_SPRITE_FLOWERPOT "flowerpot" +#define BUTT_SPRITE_GREY "grey" +#define BUTT_SPRITE_PLASMA "plasma" +#define BUTT_SPRITE_FUZZY "fuzzy" +#define BUTT_SPRITE_SLIME "slime" diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index 671037b0a56d..2ac86d647ea0 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -79,3 +79,5 @@ #define MOVESPEED_ID_SPACE_DRAGON_SAD "SPACE_DRAGON_SAD" #define MOVESPEED_ID_SPACE_DRAGON_RAGE "SPACE_DRAGON_RAGE" + +#define MOVESPEED_ID_RESIN_FOAM "RESIN_FOAM" diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index d842fc919bc4..f0582c561269 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -51,21 +51,37 @@ // Flags for the clothing_flags var on /obj/item/clothing -#define LAVAPROTECT (1<<0) -#define STOPSHIGHPRESSURE (1<<1) //SUIT and HEAD items which stop pressure damage. -#define STOPSLOWPRESSURE (1<<2) //To stop you taking all pressure damage you must have both a suit and head item with this flag. -#define BLOCK_GAS_SMOKE_EFFECT (1<<3) // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! -#define MASKINTERNALS (1<<4) // mask allows internals -#define NOSLIP (1<<5) //prevents from slipping on wet floors, in space etc -#define NOSLIP_ICE (1<<6) //prevents from slipping on frozen floors -#define THICKMATERIAL (1<<7) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. -#define VOICEBOX_TOGGLABLE (1<<8) // The voicebox in this clothing can be toggled. -#define VOICEBOX_DISABLED (1<<9) // The voicebox is currently turned off. -#define SHOWEROKAY (1<<10) //prevents you from being stupid if you shower in them -#define SCAN_REAGENTS (1<<11) // Allows helmets and glasses to scan reagents. -#define MASKEXTENDRANGE (1<<12) //! For masks, allows you to breathe from internals on adjecent tiles +/// SUIT and HEAD items which stop lava from hurting the wearer +#define LAVAPROTECT (1<<0) +/// SUIT and HEAD items which stop pressure damage. +/// To stop you taking all pressure damage you must have both a suit and head item with these flags. First one is high pressure (fires), second one is low (space). +#define STOPSHIGHPRESSURE (1<<1) +#define STOPSLOWPRESSURE (1<<2) +/// Blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! +#define BLOCK_GAS_SMOKE_EFFECT (1<<3) +/// Mask allows internals +#define MASKINTERNALS (1<<4) +/// Prevents from slipping on wet floors, in space etc +#define NOSLIP (1<<5) +/// Prevents from slipping on frozen floors +#define NOSLIP_ICE (1<<6) +/// Prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. +/// Example: space suits, biosuit, bombsuits, thick suits that cover your body. +#define THICKMATERIAL (1<<7) +/// The voicebox in this clothing can be toggled. +#define VOICEBOX_TOGGLABLE (1<<8) +/// The voicebox is currently turned off. +#define VOICEBOX_DISABLED (1<<9) +/// Prevents you from feeling sad if you shower in them +#define SHOWEROKAY (1<<10) +/// Allows helmets and glasses to scan reagents. +#define SCAN_REAGENTS (1<<11) +//! For masks, allows you to breathe from internals on adjecent tiles +#define MASKEXTENDRANGE (1<<12) /// Headgear/helmet allows internals #define HEADINTERNALS (1<<13) +/// Clothes that use large icons, for applying the proper overlays like blood +#define LARGE_WORN_ICON (1<<14) #define STOPSPRESSUREDAMAGE (STOPSHIGHPRESSURE | STOPSLOWPRESSURE) //covers both high and low pressure diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index 307af49de783..5904f4276f60 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -63,6 +63,16 @@ #define ENGINE_COEFF_MAX 2 #define ENGINE_DEFAULT_MAXSPEED_ENGINES 5 + +// Alert level related +#define ALERT_COEFF_AUTOEVAC_NORMAL 2.5 +#define ALERT_COEFF_GREEN 2 +#define ALERT_COEFF_BLUE 1 +#define ALERT_COEFF_RED 0.5 +#define ALERT_COEFF_AUTOEVAC_CRITICAL 0.4 +#define ALERT_COEFF_EPSILON 1000 +#define ALERT_COEFF_DELTA 0.25 + //Docking error flags #define DOCKING_SUCCESS 0 #define DOCKING_BLOCKED (1<<0) @@ -115,13 +125,3 @@ ///Check for arena shuttle, if the bubblegum has died this round GLOBAL_VAR_INIT(bubblegum_dead, FALSE) - -// Alert level related for new thing im porting --- cowbot93 -#define ALERT_COEFF_AUTOEVAC_NORMAL 6 -#define ALERT_COEFF_GREEN 5 -#define ALERT_COEFF_BLUE 4 -#define ALERT_COEFF_RED 3 -#define ALERT_COEFF_AUTOEVAC_CRITICAL 2 -#define ALERT_COEFF_DELTA 1 -#define ALERT_COEFF_GAMMA 0 -#define ALERT_COEFF_EPSILON -1 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 0215cae1d8a9..6a4e44947fd7 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -154,7 +154,7 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_HYPERTORUS_MELTING "hypertorus_melting" #define SFX_IM_HERE "im_here" #define SFX_LAW "law" -#define SFX_PAGE_TURN "page_turn" +#define SFX_PAGE_TURN "pageturn" #define SFX_PUNCH "punch" #define SFX_REVOLVER_SPIN "revolver_spin" #define SFX_RICOCHET "ricochet" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ab49290820fb..359711f46144 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -116,6 +116,8 @@ #define STATUS_EFFECT_EXPOSED /datum/status_effect/exposed //increases incoming damage +#define STATUS_EFFECT_EXPOSED_HARPOONED /datum/status_effect/exposed/harpooned //increases incoming damage when hit by a gasharpoon + #define STATUS_EFFECT_TAMING /datum/status_effect/taming //tames the target after enough tame stacks #define STATUS_EFFECT_NECROPOLIS_CURSE /datum/status_effect/necropolis_curse diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index e5357fbe10b0..3d8b17cdac94 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -137,7 +137,9 @@ #define INIT_ORDER_INPUT 85 #define INIT_ORDER_SOUNDS 83 #define INIT_ORDER_INSTRUMENTS 82 +#define INIT_ORDER_GREYSCALE 81 #define INIT_ORDER_VIS 80 +#define INIT_ORDER_SECURITY_LEVEL 79 #define INIT_ORDER_MATERIALS 76 #define INIT_ORDER_RESEARCH 75 #define INIT_ORDER_STATION 74 @@ -173,7 +175,8 @@ #define INIT_ORDER_PATH -50 #define INIT_ORDER_DISCORD -60 #define INIT_ORDER_EXPLOSIONS -69 -#define INIT_ORDER_STATPANELS -98 +#define INIT_ORDER_STATPANELS -97 +#define INIT_ORDER_INIT_PROFILER -98 //Near the end, logs the costs of initialize #define INIT_ORDER_DEMO -99 // To avoid a bunch of changes related to initialization being written, do this last #define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index d7f7deec743e..a4fb6d40be73 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.4.5" +#define TGS_DMAPI_VERSION "7.1.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -12,8 +12,8 @@ // Comment this out once you've filled in the below. #error TGS API unconfigured -// Uncomment this if you wish to allow the game to interact with TGS 3. -// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()() +// Uncomment this if you wish to allow the game to interact with TGS 3.. +// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()(). //#define TGS_V3_API // Required interfaces (fill in with your codebase equivalent): @@ -50,46 +50,55 @@ #endif +#ifndef TGS_FILE2TEXT_NATIVE +#ifdef file2text +#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You can fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses +#endif +#define TGS_FILE2TEXT_NATIVE file2text +#endif + // EVENT CODES -/// Before a reboot mode change, extras parameters are the current and new reboot mode enums +/// Before a reboot mode change, extras parameters are the current and new reboot mode enums. #define TGS_EVENT_REBOOT_MODE_CHANGE -1 -/// Before a port change is about to happen, extra parameters is new port +/// Before a port change is about to happen, extra parameters is new port. #define TGS_EVENT_PORT_SWAP -2 -/// Before the instance is renamed, extra parameter is the new name +/// Before the instance is renamed, extra parameter is the new name. #define TGS_EVENT_INSTANCE_RENAMED -3 -/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server +/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server. #define TGS_EVENT_WATCHDOG_REATTACH -4 +/// When the watchdog sends a health check to DD. No parameters. +#define TGS_EVENT_HEALTH_CHECK -5 -/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA +/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA. #define TGS_EVENT_REPO_RESET_ORIGIN 0 -/// When the repository performs a checkout. Parameters: Checkout git object +/// When the repository performs a checkout. Parameters: Checkout git object. #define TGS_EVENT_REPO_CHECKOUT 1 -/// When the repository performs a fetch operation. No parameters +/// When the repository performs a fetch operation. No parameters. #define TGS_EVENT_REPO_FETCH 2 -/// When the repository test merges. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user +/// When the repository test merges. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user. #define TGS_EVENT_REPO_MERGE_PULL_REQUEST 3 -/// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path +/// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path. #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 -/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND -#define TGS_EVENT_BYOND_INSTALL_START 5 -/// When a BYOND install operation fails. Parameters: Error message -#define TGS_EVENT_BYOND_INSTALL_FAIL 6 -/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND -#define TGS_EVENT_BYOND_ACTIVE_VERSION_CHANGE 7 -/// When the compiler starts running. Parameters: Game directory path, origin commit SHA +/// Before a engine install operation begins. Parameters: Version string of the installing engine. +#define TGS_EVENT_ENGINE_INSTALL_START 5 +/// When a engine install operation fails. Parameters: Error message +#define TGS_EVENT_ENGINE_INSTALL_FAIL 6 +/// When the active engine version changes. Parameters: (Nullable) Version string of the current engine, version string of the new engine. +#define TGS_EVENT_ENGINE_ACTIVE_VERSION_CHANGE 7 +/// When the compiler starts running. Parameters: Game directory path, origin commit SHA. #define TGS_EVENT_COMPILE_START 8 -/// When a compile is cancelled. No parameters +/// When a compile is cancelled. No parameters. #define TGS_EVENT_COMPILE_CANCELLED 9 -/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation +/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation. #define TGS_EVENT_COMPILE_FAILURE 10 -/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path +/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path. #define TGS_EVENT_COMPILE_COMPLETE 11 -/// When an automatic update for the current instance begins. No parameters +/// When an automatic update for the current instance begins. No parameters. #define TGS_EVENT_INSTANCE_AUTO_UPDATE_START 12 -/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference +/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference. #define TGS_EVENT_REPO_MERGE_CONFLICT 13 -/// When a deployment completes. No Parameters +/// When a deployment completes. No Parameters. #define TGS_EVENT_DEPLOYMENT_COMPLETE 14 /// Before the watchdog shuts down. Not sent for graceful shutdowns. No parameters. #define TGS_EVENT_WATCHDOG_SHUTDOWN 15 @@ -104,11 +113,11 @@ #define TGS_EVENT_WORLD_PRIME 21 // DMAPI also doesnt implement this // #define TGS_EVENT_DREAM_DAEMON_LAUNCH 22 -/// After a single submodule update is performed. Parameters: Updated submodule name +/// After a single submodule update is performed. Parameters: Updated submodule name. #define TGS_EVENT_REPO_SUBMODULE_UPDATE 23 -/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, byond version +/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, version string of the used engine. #define TGS_EVENT_PRE_DREAM_MAKER 24 -/// Whenever a deployment folder is deleted from disk. Parameters: Game directory path +/// Whenever a deployment folder is deleted from disk. Parameters: Game directory path. #define TGS_EVENT_DEPLOYMENT_CLEANUP 25 // OTHER ENUMS @@ -120,6 +129,7 @@ /// The watchdog will restart on reboot. #define TGS_REBOOT_MODE_RESTART 2 +// Note that security levels are currently meaningless in OpenDream /// DreamDaemon Trusted security level. #define TGS_SECURITY_TRUSTED 0 /// DreamDaemon Safe security level. @@ -127,6 +137,18 @@ /// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 +/// DreamDaemon public visibility level. +#define TGS_VISIBILITY_PUBLIC 0 +/// DreamDaemon private visibility level. +#define TGS_VISIBILITY_PRIVATE 1 +/// DreamDaemon invisible visibility level. +#define TGS_VISIBILITY_INVISIBLE 2 + +/// The Build Your Own Net Dream engine. +#define TGS_ENGINE_TYPE_BYOND 0 +/// The OpenDream engine. +#define TGS_ENGINE_TYPE_OPENDREAM 1 + //REQUIRED HOOKS /** @@ -152,7 +174,7 @@ #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return /** - * Call this as late as possible in [world/proc/Reboot]. + * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()). */ /world/proc/TgsReboot() return @@ -164,28 +186,28 @@ /datum/tgs_revision_information /// Full SHA of the commit. var/commit - /// ISO 8601 timestamp of when the commit was created + /// ISO 8601 timestamp of when the commit was created. var/timestamp /// Full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch. var/origin_commit /// Represents a version. /datum/tgs_version - /// The suite/major version number + /// The suite/major version number. var/suite - // This group of variables can be null to represent a wild card - /// The minor version number. null for wildcards + // This group of variables can be null to represent a wild card. + /// The minor version number. null for wildcards. var/minor - /// The patch version number. null for wildcards + /// The patch version number. null for wildcards. var/patch - /// Legacy version number. Generally null + /// Legacy version number. Generally null. var/deprecated_patch - /// Unparsed string value + /// Unparsed string value. var/raw_parameter - /// String value minus prefix + /// String value minus prefix. var/deprefixed_parameter /** @@ -231,38 +253,43 @@ var/is_admin_channel /// [TRUE]/[FALSE] if the channel is a private message channel for a [/datum/tgs_chat_user]. var/is_private_channel - /// Tag string associated with the channel in TGS + /// Tag string associated with the channel in TGS. var/custom_tag - /// [TRUE]/[FALSE] if the channel supports embeds + /// [TRUE]/[FALSE] if the channel supports embeds. var/embeds_supported // Represents a chat user /datum/tgs_chat_user /// TGS internal user ID. var/id - // The user's display name. + /// The user's display name. var/friendly_name - // The string to use to ping this user in a message. + /// The string to use to ping this user in a message. var/mention - /// The [/datum/tgs_chat_channel] the user was from + /// The [/datum/tgs_chat_channel] the user was from. var/datum/tgs_chat_channel/channel +/// User definable handler for TGS events. +/datum/tgs_event_handler + /// If the handler receieves [TGS_EVENT_HEALTH_CHECK] events. + var/receive_health_checks = FALSE + /** * User definable callback for handling TGS events. * - * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each + * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each. */ /datum/tgs_event_handler/proc/HandleEvent(event_code, ...) set waitfor = FALSE return -/// User definable chat command +/// User definable chat command. /datum/tgs_chat_command - /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...` + /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...`. var/name = "" - /// The help text displayed for this command + /// The help text displayed for this command. var/help_text = "" - /// If this command should be available to game administrators only + /// If this command should be available to game administrators only. var/admin_only = FALSE /// A subtype of [/datum/tgs_chat_command] that is ignored when enumerating available commands. Use this to create shared base /datums for commands. var/ignore_type @@ -276,7 +303,7 @@ /datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params) CRASH("[type] has no implementation for Run()") -/// User definable chat message +/// User definable chat message. /datum/tgs_message_content /// The tring content of the message. Must be provided in New(). var/text @@ -300,7 +327,7 @@ /// Timestamp must be encoded as: time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss"). Use the active timezone. var/timestamp - /// Colour must be #AARRGGBB or #RRGGBB hex string + /// Colour must be #AARRGGBB or #RRGGBB hex string. var/colour /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details. @@ -318,7 +345,7 @@ var/list/datum/tgs_chat_embed/field/fields -/// Common datum for similar discord embed medias +/// Common datum for similar discord embed medias. /datum/tgs_chat_embed/media /// Must be set in New(). var/url @@ -396,16 +423,17 @@ // No function below this succeeds if it TgsAvailable() returns FALSE or if TgsNew() has yet to be called. /** - * Forces a hard reboot of DreamDaemon by ending the process. + * Forces a hard reboot of DreamDaemon by ending the process. This function may sleep! * * Unlike del(world) clients will try to reconnect. - * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again + * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again. */ /world/proc/TgsEndProcess() return /** - * Send a message to connected chats. + * Send a message to connected chats. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. @@ -414,7 +442,8 @@ return /** - * Send a private message to a specific user. + * Send a private message to a specific user. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * user: The [/datum/tgs_chat_user] to PM. @@ -422,10 +451,9 @@ /world/proc/TgsChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user) return -// The following functions will sleep if a call to TgsNew() is sleeping - /** - * Send a message to connected chats that are flagged as game-related in TGS. + * Send a message to connected chats that are flagged as game-related in TGS. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. @@ -433,38 +461,56 @@ /world/proc/TgsChatBroadcast(datum/tgs_message_content/message, list/channels = null) return -/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. +/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsVersion() return -/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. +/// Returns the running engine type +/world/proc/TgsEngine() + return + +/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsApiVersion() return -/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. +/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsInstanceName() return -/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. +/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsRevision() return -/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. +/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsSecurityLevel() return -/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. +/// Returns the current BYOND visibility level as a TGS_VISIBILITY_ define if TGS is present, null otherwise. Requires TGS to be using interop API version 5 or higher otherwise the string "___unimplemented" wil be returned. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! +/world/proc/TgsVisibility() + return + +/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsTestMerges() return -/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. +/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsChatChannelInfo() return +/** + * Trigger an event in TGS. Requires TGS version >= 6.3.0. Returns [TRUE] if the event was triggered successfully, [FALSE] otherwise. This function may sleep! + * + * event_name - The name of the event to trigger + * parameters - Optional list of string parameters to pass as arguments to the event script. The first parameter passed to a script will always be the running game's directory followed by these parameters. + * wait_for_completion - If set, this function will not return until the event has run to completion. + */ +/world/proc/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + return + /* The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2017-2023 Jordan Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 89246e0ddac9..1ef42bdbb560 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -186,6 +186,7 @@ #define TRAIT_BADMAIL "badmail" //Your mail is going to be worse than average #define TRAIT_SHORT_TELOMERES "short_telomeres" //You cannot be CLOONED #define TRAIT_LONG_TELOMERES "long_telomeres" //You get CLOONED faster!!! +#define TRAIT_NO_GRENADES "no_nades" ///You become a Marine that can eat crayons!!! #define TRAIT_MARINE "marine" @@ -259,6 +260,7 @@ #define SINFULDEMON_TRAIT "sinfuldemon" #define CHANGESTING_TRAIT "changesting" #define POSIBRAIN_TRAIT "positrait" +#define SYNTHETIC_TRAIT "synthetictrait" #define WRIST_STRAP_TRAIT "wrist_strap" #define GRIMOIRE_TRAIT "grimoire_trait" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 4cb7051cb3ba..65475f68432e 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -670,6 +670,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_APC_SHOCKING "apc_shocking" /// Properly wielded two handed item #define TRAIT_WIELDED "wielded" +/// This item is currently performing a cleaving attack +#define TRAIT_CLEAVING "cleaving" /// A transforming item that is actively extended / transformed #define TRAIT_TRANSFORM_ACTIVE "active_transform" /// Buckling yourself to objects with this trait won't immobilize you @@ -955,6 +957,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This mob heals from cult pylons. #define TRAIT_HEALS_FROM_CULT_PYLONS "heals_from_cult_pylons" +/// Allows crew monitor tracking without a suit +#define TRAIT_SUITLESS_SENSORS "suitless_sensors" + /// Ignore Crew monitor Z levels #define TRAIT_MULTIZ_SUIT_SENSORS "multiz_suit_sensors" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index f9cdbe4326d1..d990e998bc56 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -89,6 +89,8 @@ #define SWORDPLAY_TRAIT "swordplay" /// Trait given by being recruited as a nuclear operative #define NUKE_OP_MINION_TRAIT "nuke-op-minion" +/// Trait given by nanites +#define NANITE_TRAIT "nanites" /// Trait given to you by shapeshifting #define SHAPESHIFT_TRAIT "shapeshift_trait" diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 7b3738de460c..10d0204ed7ef 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -72,6 +72,7 @@ #define VV_HK_WEAKREF_RESOLVE "weakref_resolve" // /atom #define VV_HK_MODIFY_TRANSFORM "atom_transform" +#define VV_HK_MODIFY_GREYSCALE "modify_greyscale" #define VV_HK_ADD_REAGENT "addreagent" #define VV_HK_TRIGGER_EMP "empulse" #define VV_HK_TRIGGER_EXPLOSION "explode" diff --git a/code/__HELPERS/animations.dm b/code/__HELPERS/animations.dm index cae8d3a8f52b..e80bfe319c0c 100644 --- a/code/__HELPERS/animations.dm +++ b/code/__HELPERS/animations.dm @@ -65,3 +65,53 @@ animate(transform = transforms[2], time = 0.1) animate(transform = transforms[3], time = 0.2) animate(transform = transforms[4], time = 0.3) + + +/** + * Proc called when you want the atom to spin around the center of its icon (or where it would be if its transform var is translated) + * By default, it makes the atom spin forever and ever at a speed of 60 rpm. + * + * Arguments: + * * speed: how much it takes for the atom to complete one 360° rotation + * * loops: how many times do we want the atom to rotate + * * clockwise: whether the atom ought to spin clockwise or counter-clockwise + * * segments: in how many animate calls the rotation is split. Probably unnecessary, but you shouldn't set it lower than 3 anyway. + * * parallel: whether the animation calls have the ANIMATION_PARALLEL flag, necessary for it to run alongside concurrent animations. + */ +/atom/proc/SpinAnimation(speed = 1 SECONDS, loops = -1, clockwise = TRUE, segments = 3, parallel = TRUE) + if(!segments) + return + var/segment = 360/segments + if(!clockwise) + segment = -segment + SEND_SIGNAL(src, COMSIG_ATOM_SPIN_ANIMATION, speed, loops, segments, segment) + do_spin_animation(speed, loops, segments, segment, parallel) + +/atom/proc/DabAnimation(speed = 1, loops = 1, direction = 1 , hold_seconds = 0 , angle = 1 , stay = FALSE) // Hopek 2019 + // By making this in atom/proc everything in the game can potentially dab. You have been warned. + if(hold_seconds > 9999) // if you need to hold a dab for more than 2 hours intentionally let me know. + return + if(hold_seconds > 0) + hold_seconds = hold_seconds * 10 // Converts seconds to deciseconds + if(angle == 1) //if angle is 1: random angle. Else take angle + angle = rand(25,50) + if(direction == 1) // direciton:: 1 for random pick, 2 for clockwise , 3 for anti-clockwise + direction = pick(2,3) + if(direction == 3) // if 3 then counter clockwise + angle = angle * -1 + if(speed == 1) // if speed is 1 choose random speed from list + speed = rand(3,5) + + // dab matrix here + var/matrix/DAB_COMMENCE = matrix(transform) + var/matrix/DAB_RETURN = matrix(transform) + DAB_COMMENCE.Turn(angle) // dab angle to matrix + + // Dab animation + animate(src, transform = DAB_COMMENCE, time = speed, loops ) // dab to hold angle + if(hold_seconds > 0) + sleep(hold_seconds) // time to hold the dab before going back + if(!stay) // if stay param is true dab doesn't return + animate(transform = DAB_RETURN, time = speed * 1.5, loops ) // reverse dab to starting position , slower + //doesn't have an object argument because this is "Stacking" with the animate call above + //3 billion% intentional diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index c1f867722004..15a8df70135e 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -36,6 +36,8 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_records_dsc(datum/data/record/a, datum/data/record/b) return sorttext(a.fields[GLOB.cmp_field], b.fields[GLOB.cmp_field]) +/proc/cmp_ai_record_dsc(a, b) + return b["score"] - a["score"] // Datum cmp with vars is always slower than a specialist cmp proc, use your judgement. /proc/cmp_datum_numeric_asc(datum/a, datum/b, variable) return cmp_numeric_asc(a.vars[variable], b.vars[variable]) diff --git a/code/__HELPERS/colors.dm b/code/__HELPERS/colors.dm index 134091a88f88..6c6f8064d9a2 100644 --- a/code/__HELPERS/colors.dm +++ b/code/__HELPERS/colors.dm @@ -40,6 +40,10 @@ /// But paired down and modified to work for our color range /// Accepts the color cutoffs as two 3 length list(0-100,...) arguments /proc/blend_cutoff_colors(list/first_color, list/second_color) + // These runtimes usually mean that either the eye or the glasses have an incorrect color_cutoffs + ASSERT(first_color?.len == 3, "First color must be a 3 length list, received [json_encode(first_color)]") + ASSERT(second_color?.len == 3, "Second color must be a 3 length list, received [json_encode(second_color)]") + var/list/output = new /list(3) // Invert the colors, multiply to "darken" (actually lights), then uninvert to get back to what we want diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index 636e4735bc02..2fca8792abe5 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -2,60 +2,6 @@ . = new_angle - old_angle Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT -/atom/proc/SpinAnimation(speed = 1 SECONDS, loops = -1, clockwise = 1, segments = 3, parallel = TRUE) - if(!segments) - return - var/segment = 360/segments - if(!clockwise) - segment = -segment - var/list/matrices = list() - for(var/i in 1 to segments-1) - var/matrix/M = matrix(transform) - M.Turn(segment*i) - matrices += M - var/matrix/last = matrix(transform) - matrices += last - - speed /= segments - - if(parallel) - animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) - else - animate(src, transform = matrices[1], time = speed, loops) - for(var/i in 2 to segments) //2 because 1 is covered above - animate(transform = matrices[i], time = speed) - //doesn't have an object argument because this is "Stacking" with the animate call above - //3 billion% intentional - -/atom/proc/DabAnimation(speed = 1, loops = 1, direction = 1 , hold_seconds = 0 , angle = 1 , stay = FALSE) // Hopek 2019 - // By making this in atom/proc everything in the game can potentially dab. You have been warned. - if(hold_seconds > 9999) // if you need to hold a dab for more than 2 hours intentionally let me know. - return - if(hold_seconds > 0) - hold_seconds = hold_seconds * 10 // Converts seconds to deciseconds - if(angle == 1) //if angle is 1: random angle. Else take angle - angle = rand(25,50) - if(direction == 1) // direciton:: 1 for random pick, 2 for clockwise , 3 for anti-clockwise - direction = pick(2,3) - if(direction == 3) // if 3 then counter clockwise - angle = angle * -1 - if(speed == 1) // if speed is 1 choose random speed from list - speed = rand(3,5) - - // dab matrix here - var/matrix/DAB_COMMENCE = matrix(transform) - var/matrix/DAB_RETURN = matrix(transform) - DAB_COMMENCE.Turn(angle) // dab angle to matrix - - // Dab animation - animate(src, transform = DAB_COMMENCE, time = speed, loops ) // dab to hold angle - if(hold_seconds > 0) - sleep(hold_seconds) // time to hold the dab before going back - if(!stay) // if stay param is true dab doesn't return - animate(transform = DAB_RETURN, time = speed * 1.5, loops ) // reverse dab to starting position , slower - //doesn't have an object argument because this is "Stacking" with the animate call above - //3 billion% intentional - //Dumps the matrix data in format a-f /matrix/proc/tolist() . = list() diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 3661d0c2ed8f..b6fd5669bb81 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -155,11 +155,13 @@ var/title var/message + if(selected_level.custom_title) + title = selected_level.custom_title if(current_level_number > previous_level_number) - title = "Attention! Security level elevated to [current_level_name]:" + title = title || "Attention! Security level elevated to [current_level_name]:" message = selected_level.elevating_to_announcement else - title = "Attention! Security level lowered to [current_level_name]:" + title = title || "Attention! Security level lowered to [current_level_name]:" message = selected_level.lowering_to_announcement var/list/level_announcement_strings = list() diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index ac89b9855de4..6bab5f05dbff 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -143,8 +143,9 @@ if(337.5 to 360) return NORTH -/proc/angle2dir_cardinal(angle) - switch(round(angle, 0.1)) +/proc/angle2dir_cardinal(degree) + degree = SIMPLIFY_DEGREES(degree) + switch(round(degree, 0.1)) if(315.5 to 360, 0 to 45.5) return NORTH if(45.6 to 135.5) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index ff508dabe517..ee4247a85390 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1216,3 +1216,75 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) set waitfor = FALSE return call(source, proctype)(arglist(arguments)) +/proc/tgui_login_data(mob/user, obj/machine, silicon_access = TRUE, admin_ghost_access = TRUE, access_requirement) + var/list/data = list() + if(!user || (!machine && !access_requirement)) + return data + + if(issilicon(user) && silicon_access) + var/mob/living/silicon/borg = user + data["username"] = borg.name + data["has_access"] = TRUE + + if(IsAdminGhost(user) && admin_ghost_access) + data["username"] = user.client.holder.admin_signature + data["has_access"] = TRUE + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/username = H.get_authentification_name("Unknown") + data["username"] = H.get_authentification_name("Unknown") + if(username != "Unknown") + var/datum/data/record/record + for(var/RP in GLOB.data_core.general) + var/datum/data/record/R = RP + if(!istype(R)) + continue + if(R.fields["name"] == username) + record = R + break + if(record) + if(istype(record.fields["photo_front"], /obj/item/photo)) + var/obj/item/photo/P1 = record.fields["photo_front"] + var/icon/picture = icon(P1.picture.picture_image) + picture.Crop(10, 32, 22, 22) + var/md5 = md5(fcopy_rsc(picture)) + + if(!SSassets.cache["photo_[md5]_cropped.png"]) + SSassets.transport.register_asset("photo_[md5]_cropped.png", picture) + SSassets.transport.send_assets(user, list("photo_[md5]_cropped.png" = picture)) + + data["user_image"] = SSassets.transport.get_asset_url("photo_[md5]_cropped.png") + if(machine) + data["has_access"] = machine.check_access(user.get_idcard()) + else + var/obj/item/id_giver = user.get_idcard() + var/access_list = id_giver.GetAccess() + data["has_access"] = (access_requirement in access_list) + + return data + +/proc/tgui_login_act(mob/user, obj/machine, silicon_access = TRUE, admin_ghost_access = TRUE, access_requirement) + if(!user || (!machine && !access_requirement)) + return FALSE + + if(issilicon(user) && silicon_access) + return TRUE + + if(IsAdminGhost(user) && admin_ghost_access) + return TRUE + + var/mob/living/carbon/human/H = user + if(!istype(H)) + return FALSE + + if(machine) + if(machine.check_access(H.get_idcard())) + return TRUE + else + var/obj/item/id_giver = H.get_idcard() + var/access_list = id_giver.GetAccess() + if(access_requirement in access_list) + return TRUE + + return FALSE diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index e4857d7d25f0..84a8b7329fa5 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -11,7 +11,7 @@ //If you update these values, update the message in the #error #define MAX_BYOND_MAJOR 515 -#define MAX_BYOND_MINOR 1630 +#define MAX_BYOND_MINOR 1640 // You can define IGNORE_MAX_BYOND_VERSION to bypass the max version check. // Note: This will likely break the game, especially any extools/auxtools linkage. Only use if you know what you're doing! @@ -25,7 +25,7 @@ #if ((DM_VERSION > MAX_BYOND_MAJOR) || (DM_BUILD > MAX_BYOND_MINOR)) && !defined(IGNORE_MAX_BYOND_VERSION) // Not updating until we fully move to 515 -#error Your version of BYOND is too new to compile this project. Download version 515.1630 at www.byond.com/download/build/515/515.1630_byond.exe +#error Your version of BYOND is too new to compile this project. Download version 515.1640 at www.byond.com/download/build/515/515.1640_byond.exe #endif // 515 split call for external libraries into call_ext diff --git a/code/_compile_options.dm b/code/_compile_options.dm index d036b262f9c3..aa0f942b14ed 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -21,11 +21,14 @@ #endif // If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between -// #define UNIT_TESTS +//#define UNIT_TESTS // If defined, we will NOT defer asset generation till later in the game, and will instead do it all at once, during initiialize //#define DO_NOT_DEFER_ASSETS +// Uncomment to run runtimestation (less time to compile) +//#define LOWMEMORYMODE + #ifndef PRELOAD_RSC //set to: #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 0256990b69cc..085f3c4a4623 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -655,7 +655,8 @@ GLOBAL_LIST_INIT(maintenance_loot_minor,list( /obj/item/storage/box/cups = W_RARE, /obj/item/storage/box/drinkingglasses = W_UNCOMMON, /obj/item/storage/box/gloves = W_RARE, - /obj/item/storage/box/hug/survival = W_UNCOMMON, + /obj/item/storage/box/survival/hug = W_UNCOMMON, + /obj/item/storage/box/survival/hug/black = W_UNCOMMON, /obj/item/storage/box/masks = W_RARE, /obj/item/storage/box/pillbottles = W_RARE, /obj/item/storage/box/rxglasses = W_RARE, @@ -760,7 +761,6 @@ GLOBAL_LIST_INIT(maintenance_loot_minor,list( /obj/item/storage/box/hug/medical = W_MYTHICAL, /obj/item/storage/box/mixedcubes = W_RARE, /obj/item/storage/box/monkeycubes = W_RARE, - /obj/item/storage/box/plasmaman = W_RARE, /obj/item/storage/box/smart_metal_foam = W_RARE, /obj/item/storage/firstaid = W_MYTHICAL, /obj/item/storage/firstaid/ancient = W_MYTHICAL, diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 05ab047dc869..975899457351 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -1,4 +1,5 @@ GLOBAL_LIST_EMPTY(cable_list) //Index for all cables, so that powernets don't have to look through the entire world all the time +GLOBAL_LIST_EMPTY(ethernet_cable_list) //Index for all ethernet cables, so that ainets don't have to look through the entire world all the time GLOBAL_LIST_EMPTY(portals) //list of all /obj/effect/portal GLOBAL_LIST_EMPTY(airlocks) //list of all airlocks GLOBAL_LIST_EMPTY(mechas_list) //list of all mechs. Used by hostile mobs target tracking. @@ -8,7 +9,7 @@ GLOBAL_LIST_EMPTY(lights) //list of all light bulbs GLOBAL_LIST_EMPTY(syndicate_shuttle_boards) //important to keep track of for managing nukeops war declarations. GLOBAL_LIST_EMPTY(navbeacons) //list of all bot nagivation beacons, used for patrolling. GLOBAL_LIST_EMPTY(teleportbeacons) //list of all tracking beacons used by teleporters -GLOBAL_LIST_EMPTY(deliverybeacons) //list of all MULEbot delivery beacons. +GLOBAL_LIST_EMPTY(deliverybeacons) //lisAt of all MULEbot delivery beacons. GLOBAL_LIST_EMPTY(deliverybeacontags) //list of all tags associated with delivery beacons. GLOBAL_LIST_EMPTY(nuke_list) GLOBAL_LIST_EMPTY(alarmdisplay) //list of all machines or programs that can display station alerts diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index bd596b8e165c..ed1e1b7477a8 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -134,6 +134,12 @@ if((obj_flags & EMAGGED) || (obj_flags & CMAGGED)) return + var/mob/living/silicon/ai/AI = usr + if(istype(AI) && !AI.has_subcontroller_connection(get_area(src))) + to_chat(AI, span_warning("No connection to subcontroller detected. Priming servos...")) + if(!do_after(AI, 1 SECONDS, src, IGNORE_USER_LOC_CHANGE)) + return + toggle_bolt(usr) add_hiddenprint(usr) @@ -141,6 +147,12 @@ if((obj_flags & EMAGGED) || (obj_flags & CMAGGED)) return + var/mob/living/silicon/ai/AI = usr + if(istype(AI) && !AI.has_subcontroller_connection(get_area(src))) + to_chat(AI, span_warning("No connection to subcontroller detected. Priming servos...")) + if(!do_after(AI, 1 SECONDS, src, IGNORE_USER_LOC_CHANGE)) + return + if(!secondsElectrified) shock_perm(usr) else @@ -150,6 +162,11 @@ if((obj_flags & EMAGGED) || (obj_flags & CMAGGED)) return + var/mob/living/silicon/ai/AI = usr + if(istype(AI) && !AI.has_subcontroller_connection(get_area(src))) + to_chat(AI, span_warning("No connection to subcontroller detected. Priming servos...")) + if(!do_after(AI, 1 SECONDS, src, IGNORE_USER_LOC_CHANGE)) + return user_toggle_open(usr) add_hiddenprint(usr) @@ -157,11 +174,23 @@ if((obj_flags & EMAGGED) || (obj_flags & CMAGGED)) return + var/mob/living/silicon/ai/AI = usr + if(istype(AI) && !AI.has_subcontroller_connection(get_area(src))) + to_chat(AI, span_warning("No connection to subcontroller detected. Priming servos...")) + if(!do_after(AI, 1 SECONDS, src, IGNORE_USER_LOC_CHANGE)) + return + toggle_emergency(usr) add_hiddenprint(usr) /* APC */ /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. + + var/mob/living/silicon/ai/AI = usr + if(istype(AI) && !AI.has_subcontroller_connection(get_area(src))) + to_chat(AI, span_warning("No connection to subcontroller detected. Polling APC...")) + if(!do_after(AI, 1 SECONDS, src, IGNORE_USER_LOC_CHANGE)) + return if(can_use(usr, 1)) toggle_breaker(usr) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index c28962755456..03c8a576c93c 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -30,13 +30,13 @@ return TRUE //return FALSE to avoid calling attackby after this proc does stuff // No comment -/atom/proc/attackby(obj/item/W, mob/user, params) - if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, params) & COMPONENT_NO_AFTERATTACK) +/atom/proc/attackby(obj/item/attacking_item, mob/user, params) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, attacking_item, user, params) & COMPONENT_NO_AFTERATTACK) return TRUE return FALSE /obj/attackby(obj/item/I, mob/living/user, params) - return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user)) + return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_atom(src, user)) /mob/living/attackby(obj/item/I, mob/living/user, params) for(var/datum/surgery/S in surgeries) @@ -70,6 +70,8 @@ if(item_flags & NOBLUDGEON) return + if(force && !synth_check(user, SYNTH_ORGANIC_HARM)) + return if(force && HAS_TRAIT(user, TRAIT_PACIFISM) && (damtype != STAMINA)) to_chat(user, span_warning("You don't want to harm other living beings!")) return TRUE @@ -100,27 +102,39 @@ log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) + var/force_multiplier = 1 + if(is_synth(user)) + var/mob/living/carbon/human/H = user + var/datum/species/wy_synth/S = H.dna.species + force_multiplier = S.force_multiplier + + take_damage(rand(weapon_stats[DAMAGE_LOW] * force_multiplier, weapon_stats[DAMAGE_HIGH] * force_multiplier), sound_effect = FALSE) - take_damage(rand(weapon_stats[DAMAGE_LOW], weapon_stats[DAMAGE_HIGH]), sound_effect = FALSE) - -//the equivalent of the standard version of attack() but for object targets. -/obj/item/proc/attack_obj(obj/O, mob/living/user) - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, O, user) & COMPONENT_NO_ATTACK_OBJ) +//the equivalent of the standard version of attack() but for non-mob targets. +/obj/item/proc/attack_atom(atom/attacked_atom, mob/living/user) + if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, attacked_atom, user) & COMPONENT_NO_ATTACK_OBJ) return if(item_flags & NOBLUDGEON) return - var/dist = get_dist(O,user) + var/dist = get_dist(attacked_atom,user) + if(!synth_check(user, SYNTH_OBJ_DAMAGE)) + return user.changeNext_move(CLICK_CD_MELEE * weapon_stats[SWING_SPEED] * (range_cooldown_mod ? (dist > 0 ? min(dist, weapon_stats[REACH]) * range_cooldown_mod : range_cooldown_mod) : 1)) //range increases attack cooldown by swing speed - user.do_attack_animation(O) - O.attacked_by(src, user) + user.do_attack_animation(attacked_atom) + attacked_atom.attacked_by(src, user) user.weapon_slow(src) + var/force_multiplier = 1 + if(is_synth(user)) + var/mob/living/carbon/human/H = user + var/datum/species/wy_synth/S = H.dna.species + force_multiplier = S.force_multiplier if(!QDELETED(src)) - take_damage(rand(weapon_stats[DAMAGE_LOW], weapon_stats[DAMAGE_HIGH]), sound_effect = FALSE) + take_damage(rand(weapon_stats[DAMAGE_LOW] * force_multiplier, weapon_stats[DAMAGE_HIGH] * force_multiplier), sound_effect = FALSE) -/atom/movable/proc/attacked_by() - return +/atom/proc/attacked_by(obj/item/attacking_item, mob/living/user) + if(!uses_integrity) + CRASH("attacked_by() was called on [type], which doesn't use integrity!") -/obj/attacked_by(obj/item/attacking_item, mob/living/user) if(!attacking_item.force) return @@ -128,13 +142,16 @@ var/damage_verb = "hit" if(attacking_item.demolition_mod > 1 && damage) damage_verb = "pulverized" - if(attacking_item.demolition_mod < 1 || !damage) + if(attacking_item.demolition_mod < 1) damage_verb = "ineffectively pierced" visible_message(span_danger("[user] [damage_verb] [src] with [attacking_item][damage ? "" : ", without leaving a mark"]!"), null, null, COMBAT_MESSAGE_RANGE) //only witnesses close by and the victim see a hit message. log_combat(user, src, "attacked", attacking_item) +/area/attacked_by(obj/item/attacking_item, mob/living/user) + CRASH("areas are NOT supposed to have attacked_by() called on them!") + /mob/living/attacked_by(obj/item/I, mob/living/user) send_item_attack_message(I, user) if(I.force) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 93b36ddf2b4d..2ad8972edec6 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -474,8 +474,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/newdrift = ((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, newdrift)) var/starting_tick_usage = TICK_USAGE - - if(newdrift - olddrift >= CONFIG_GET(number/drift_dump_threshold)) + //Yog: profile dumping was throttling lower performance computers, so we're going to have it disabled by default but you can enable it via config flags + if(newdrift - olddrift >= CONFIG_GET(number/drift_dump_threshold) && CONFIG_GET(flag/auto_profile)) AttemptProfileDump(CONFIG_GET(number/drift_profile_delay)) olddrift = newdrift diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index f2ce0c3522f2..8a3ca56432fa 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -1,4 +1,3 @@ -#define SUBSYSTEM_INIT_SOURCE "subsystem init" SUBSYSTEM_DEF(atoms) name = "Atoms" init_order = INIT_ORDER_ATOMS @@ -43,11 +42,16 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INSSATOMS) return - set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, SUBSYSTEM_INIT_SOURCE) + // Generate a unique mapload source for this run of InitializeAtoms + var/static/uid = 0 + uid = (uid + 1) % (SHORT_REAL_LIMIT - 1) + var/source = "subsystem init [uid]" + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, source) // This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK - CreateAtoms(atoms, atoms_to_return) - clear_tracked_initalize(SUBSYSTEM_INIT_SOURCE) + CreateAtoms(atoms, atoms_to_return, source) + clear_tracked_initalize(source) + SSicon_smooth.free_deferred(source) if(late_loaders.len) for(var/I in 1 to late_loaders.len) @@ -68,12 +72,13 @@ SUBSYSTEM_DEF(atoms) testing("[queued_deletions.len] atoms were queued for deletion.") queued_deletions.Cut() + // #ifdef PROFILE_MAPLOAD_INIT_ATOM // rustg_file_write(json_encode(mapload_init_times), "[GLOB.log_directory]/init_times.json") // #endif /// Actually creates the list of atoms. Exists soley so a runtime in the creation logic doesn't cause initalized to totally break -/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null) +/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null, mapload_source = null) if (atoms_to_return) LAZYINITLIST(created_atoms) @@ -91,7 +96,12 @@ SUBSYSTEM_DEF(atoms) for(var/I in 1 to atoms.len) var/atom/A = atoms[I] if(!(A.flags_1 & INITIALIZED_1)) - CHECK_TICK + // Unrolled CHECK_TICK setup to let us enable/disable mapload based off source + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) PROFILE_INIT_ATOM_BEGIN() InitAtom(A, TRUE, mapload_arg) PROFILE_INIT_ATOM_END(A) @@ -108,7 +118,11 @@ SUBSYSTEM_DEF(atoms) #ifdef TESTING ++count #endif - CHECK_TICK + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) testing("Initialized [count] atoms") @@ -118,12 +132,18 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/proc/map_loader_stop(source) clear_tracked_initalize(source) +/// Returns the source currently modifying SSatom's init behavior +/datum/controller/subsystem/atoms/proc/get_initialized_source() + var/state_length = length(initialized_state) + if(!state_length) + return null + return initialized_state[state_length][1] + /// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context /// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially /datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source) if(!length(initialized_state)) base_initialized = initialized - initialized_state += list(list(source, state)) initialized = state @@ -141,9 +161,9 @@ SUBSYSTEM_DEF(atoms) return initialized = initialized_state[length(initialized_state)][2] -/// Returns TRUE if anything is currently being initialized or needing to be deleted +/// Returns TRUE if anything is currently being initialized /datum/controller/subsystem/atoms/proc/initializing_something() - return length(initialized_state) + return length(initialized_state) > 1 /datum/controller/subsystem/atoms/Recover() initialized = SSatoms.initialized @@ -201,5 +221,3 @@ SUBSYSTEM_DEF(atoms) var/initlog = InitLog() if(initlog) text2file(initlog, "[GLOB.log_directory]/initialize.log") - -#undef SUBSYSTEM_INIT_SOURCE diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index a0a33f0e17ac..9e5e9ffa99de 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -9,8 +9,7 @@ SUBSYSTEM_DEF(icon_smooth) var/list/blueprint_queue = list() var/list/smooth_queue = list() var/list/deferred = list() - - var/map_loading = FALSE + var/list/deferred_by_source = list() /datum/controller/subsystem/icon_smooth/fire() // We do not want to smooth icons of atoms whose neighbors are not initialized yet, @@ -63,16 +62,30 @@ SUBSYSTEM_DEF(icon_smooth) return SS_INIT_SUCCESS +/// Releases a pool of delayed smooth attempts from a particular source +/datum/controller/subsystem/icon_smooth/proc/free_deferred(source_to_free) + smooth_queue += deferred_by_source[source_to_free] + deferred_by_source -= source_to_free + if(!can_fire) + can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/add_to_queue(atom/thing) if(thing.smoothing_flags & SMOOTH_QUEUED) return thing.smoothing_flags |= SMOOTH_QUEUED + // If we're currently locked into mapload BY something + // Then put us in a deferred list that we release when this mapload run is finished + if(initialized && length(SSatoms.initialized_state) && SSatoms.initialized == INITIALIZATION_INNEW_MAPLOAD) + var/source = SSatoms.get_initialized_source() + LAZYADD(deferred_by_source[source], thing) + return smooth_queue += thing if(!can_fire) can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/remove_from_queues(atom/thing) + // Lack of removal from deferred_by_source is safe because the lack of SMOOTH_QUEUED will just free it anyway + // Hopefully this'll never cause a harddel (dies) thing.smoothing_flags &= ~SMOOTH_QUEUED smooth_queue -= thing if(blueprint_queue) diff --git a/code/controllers/subsystem/init_profiler.dm b/code/controllers/subsystem/init_profiler.dm new file mode 100644 index 000000000000..063898b6a098 --- /dev/null +++ b/code/controllers/subsystem/init_profiler.dm @@ -0,0 +1,28 @@ +#define INIT_PROFILE_NAME "init_profiler.json" + +///Subsystem exists so we can separately log init time costs from the costs of general operation +///Hopefully this makes sorting out what causes problems when easier +SUBSYSTEM_DEF(init_profiler) + name = "Init Profiler" + init_order = INIT_ORDER_INIT_PROFILER + init_stage = INITSTAGE_MAX + flags = SS_NO_FIRE + +/datum/controller/subsystem/init_profiler/Initialize() + if(CONFIG_GET(flag/auto_profile)) + write_init_profile() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/init_profiler/proc/write_init_profile() + var/current_profile_data = world.Profile(PROFILE_REFRESH, format = "json") + CHECK_TICK + + if(!length(current_profile_data)) //Would be nice to have explicit proc to check this + stack_trace("Warning, profiling stopped manually before dump.") + var/prof_file = file("[GLOB.log_directory]/[INIT_PROFILE_NAME]") + if(fexists(prof_file)) + fdel(prof_file) + WRITE_FILE(prof_file, current_profile_data) + world.Profile(PROFILE_CLEAR) //Now that we're written this data out, dump it. We don't want it getting mixed up with our current round data + +#undef INIT_PROFILE_NAME diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 8709e70f96eb..7e6526220de5 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -308,6 +308,21 @@ SUBSYSTEM_DEF(job) return TRUE return FALSE +/datum/controller/subsystem/job/proc/FillNetminPosition() + var/datum/job/job = GetJob("Network Admin") + if(!job) + return + for(var/i = job.total_positions, i > 0, i--) + if(job.current_positions >= job.total_positions) //If we assign a netmin before this proc is run, (malf rework?) + return TRUE + for(var/level in level_order) + var/list/candidates = list() + candidates = FindOccupationCandidates(job, level) + if(candidates.len) + var/mob/dead/new_player/candidate = pick(candidates) + if(AssignRole(candidate, "Network Admin")) + break + /// Rolls a number of security based on the roundstart population /datum/controller/subsystem/job/proc/FillSecurityPositions() var/coeff = CONFIG_GET(number/min_security_scaling_coeff) @@ -392,7 +407,8 @@ SUBSYSTEM_DEF(job) //Check for an AI JobDebug("DO, Running AI Check") - FillAIPosition() + if(FillAIPosition()) + FillNetminPosition() JobDebug("DO, AI Check end") //Check for Security @@ -617,9 +633,9 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/irish_override() var/datum/map_template/template = SSmapping.station_room_templates["Bar Irish"] - for(var/obj/effect/landmark/stationroom/box/bar/B in GLOB.bar_landmarks) + for(var/obj/effect/landmark/stationroom/box/bar/B in GLOB.landmarks_list) template.load(B.loc, centered = FALSE) - + qdel(B) /datum/controller/subsystem/job/proc/random_chapel_init() try @@ -664,9 +680,9 @@ SUBSYSTEM_DEF(job) log_game("WARNING: CHAPEL RECOVERY FAILED! THERE WILL BE NO CHAPEL FOR THIS ROUND!") return - for(var/obj/effect/landmark/stationroom/box/chapel/B in GLOB.chapel_landmarks) + for(var/obj/effect/landmark/stationroom/box/chapel/B in GLOB.landmarks_list) template.load(B.loc, centered = FALSE) - + qdel(B) catch(var/exception/e) message_admins("RUNTIME IN RANDOM_CHAPEL_INIT") spawn_chapel() @@ -681,9 +697,9 @@ SUBSYSTEM_DEF(job) if(isnull(template)) message_admins("UNABLE TO SPAWN CHAPEL") - for(var/obj/effect/landmark/stationroom/box/chapel/B in GLOB.chapel_landmarks) + for(var/obj/effect/landmark/stationroom/box/chapel/B in GLOB.landmarks_list) template.load(B.loc, centered = FALSE) - + qdel(B) /datum/controller/subsystem/job/proc/random_clerk_init() try @@ -728,9 +744,9 @@ SUBSYSTEM_DEF(job) log_game("WARNING: CLERK RECOVERY FAILED! THERE WILL BE NO CLERK SHOP FOR THIS ROUND!") return - for(var/obj/effect/landmark/stationroom/box/clerk/B in GLOB.clerk_office_landmarks) + for(var/obj/effect/landmark/stationroom/box/clerk/B in GLOB.landmarks_list) template.load(B.loc, centered = FALSE) - + qdel(B) catch(var/exception/e) message_admins("RUNTIME IN RANDOM_CLERK_INIT") spawn_clerk() @@ -745,8 +761,9 @@ SUBSYSTEM_DEF(job) if(isnull(template)) message_admins("UNABLE TO SPAWN CLERK") - for(var/obj/effect/landmark/stationroom/box/clerk/B in GLOB.clerk_office_landmarks) + for(var/obj/effect/landmark/stationroom/box/clerk/B in GLOB.landmarks_list) template.load(B.loc, centered = FALSE) + qdel(B) /datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank) if(!C?.holder) diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index da3f04dcb275..4567176d931f 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -3,19 +3,19 @@ SUBSYSTEM_DEF(machines) init_order = INIT_ORDER_MACHINES flags = SS_KEEP_TIMING wait = 2 SECONDS - + var/list/processing = list() + var/list/currentrun = list() + var/list/powernets = list() + var/list/ainets = list() /// Assosciative list of all machines that exist. VAR_PRIVATE/list/machines_by_type = list() /// All machines, not just those that are processing. VAR_PRIVATE/list/all_machines = list() - - var/list/processing = list() - var/list/currentrun = list() ///List of all powernets on the server. - var/list/powernets = list() /datum/controller/subsystem/machines/Initialize() makepowernets() + makeainets() fire() return SS_INIT_SUCCESS @@ -24,6 +24,80 @@ SUBSYSTEM_DEF(machines) LAZYADD(machines_by_type[machine.type], machine) all_machines |= machine + for(var/obj/structure/cable/PC in GLOB.cable_list) + if(!PC.powernet) + var/datum/powernet/NewPN = new(PC.loc.z) + NewPN.add_cable(PC) + propagate_network(PC,PC.powernet) + +/datum/controller/subsystem/machines/proc/makeainets() + for(var/datum/ai_network/AN in ainets) + qdel(AN) + ainets.Cut() + + for(var/obj/structure/ethernet_cable/EC in GLOB.ethernet_cable_list) + if(!EC.network) + var/datum/ai_network/NewAN = new() + NewAN.add_cable(EC) + propagate_ai_network(EC,EC.network) + + for(var/obj/machinery/ai/networking/N in GLOB.ai_networking_machines) + N.roundstart_connect() + +/datum/controller/subsystem/machines/stat_entry(msg) + msg = "M:[length(processing)]|PN:[length(powernets)]|AN:[length(ainets)]" + return ..() + +/datum/controller/subsystem/machines/get_metrics() + . = ..() + .["machines"] = length(processing) + .["powernets"] = length(powernets) + +/datum/controller/subsystem/machines/fire(resumed = 0) + if (!resumed) + for(var/datum/powernet/Powernet in powernets) + Powernet.reset() //reset the power state. + src.currentrun = processing.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/obj/machinery/thing = currentrun[currentrun.len] + currentrun.len-- + if(!QDELETED(thing) && thing.process(wait * 0.1) != PROCESS_KILL) + if(thing.use_power) + thing.auto_use_power() //add back the power state + else + processing -= thing + if (!QDELETED(thing)) + thing.datum_flags &= ~DF_ISPROCESSING + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/machines/proc/setup_template_powernets(list/cables) + for(var/A in cables) + var/obj/structure/cable/PC = A + if(!PC.powernet) + var/datum/powernet/NewPN = new(PC.loc.z) + NewPN.add_cable(PC) + propagate_network(PC,PC.powernet) + +/datum/controller/subsystem/machines/proc/setup_template_ainets(list/cables) + for(var/A in cables) + var/obj/structure/ethernet_cable/PC = A + if(!PC.network) + var/datum/ai_network/NewPN = new() + NewPN.add_cable(PC) + propagate_ai_network(PC,PC.network) + +/datum/controller/subsystem/machines/Recover() + if (istype(SSmachines.processing)) + processing = SSmachines.processing + if (istype(SSmachines.powernets)) + powernets = SSmachines.powernets + if (istype(SSmachines.ainets)) + ainets = SSmachines.ainets /// Removes a machine from the machine subsystem; should only be called by the machine itself inside Destroy. /datum/controller/subsystem/machines/proc/unregister_machine(obj/machinery/machine) var/list/existing = machines_by_type[machine.type] @@ -96,14 +170,6 @@ SUBSYSTEM_DEF(machines) if (MC_TICK_CHECK) return -/datum/controller/subsystem/machines/proc/setup_template_powernets(list/cables) - for(var/A in cables) - var/obj/structure/cable/PC = A - if(!PC.powernet) - var/datum/powernet/NewPN = new(PC.loc.z) - NewPN.add_cable(PC) - propagate_network(PC,PC.powernet) - /datum/controller/subsystem/machines/Recover() if(islist(SSmachines.processing)) processing = SSmachines.processing diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index d0b3be66d49b..c5283812e880 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -175,6 +175,7 @@ SUBSYSTEM_DEF(mapping) load_new_z_level("_maps/RandomZLevels/VR/vrhub.dmm", "Virtual Reality Hub") to_chat(world, span_boldannounce("Virtual reality loaded.")) + // Generate mining ruins loading_ruins = TRUE var/list/lava_ruins = levels_by_trait(ZTRAIT_LAVA_RUINS) @@ -475,6 +476,8 @@ SUBSYSTEM_DEF(mapping) //Yogs end else if (!isnull(config.minetype) && config.minetype != "none") INIT_ANNOUNCE("WARNING: An unknown minetype '[config.minetype]' was set! This is being ignored! Update the maploader code!") + + LoadGroup(FailedZs, "Automated Exploration Hub", "RandomZLevels/VR", "netmin_hub.dmm", default_traits = ZTRAITS_AWAY_SECRET) #endif if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 3876b3e36c5a..2229dd345938 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(nightshift) priority_announce(message, sound='sound/misc/notice2.ogg', sender_override="Automated Lighting System Announcement") /datum/controller/subsystem/nightshift/proc/check_nightshift() - var/emergency = GLOB.security_level >= SEC_LEVEL_RED + var/emergency = SSsecurity_level.current_security_level.disable_night_mode var/announcing = TRUE var/time = station_time() var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time) diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 455e53d139aa..d73e211b7cfd 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -20,6 +20,7 @@ SUBSYSTEM_DEF(persistence) var/list/picture_logging_information = list() var/list/obj/structure/sign/picture_frame/photo_frames = list() var/list/obj/item/storage/photo_album/photo_albums = list() + var/list/ai_network_rankings = list("ram" = list(), "cpu" = list()) var/rounds_since_engine_exploded = 0 var/next_minetype //yogs @@ -33,6 +34,7 @@ SUBSYSTEM_DEF(persistence) if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() LoadRandomizedRecipes() + LoadAINetworkRanking() LoadDelaminationCounter() return SS_INIT_SUCCESS @@ -124,6 +126,16 @@ SUBSYSTEM_DEF(persistence) return antag_rep = json_decode(json) +/datum/controller/subsystem/persistence/proc/LoadAINetworkRanking() + var/json = file2text("data/AINetworkRank.json") + if(!json) + var/json_file = file("data/AINetworkRank.json") + if(!fexists(json_file)) + WARNING("Failed to load ai network ranks. File likely corrupt.") + return + return + ai_network_rankings = json_decode(json) + /datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) for(var/A in GLOB.trophy_cases) var/obj/structure/displaycase/trophy/T = A @@ -159,6 +171,7 @@ SUBSYSTEM_DEF(persistence) CollectAntagReputation() SaveRandomizedRecipes() SaveScars() + SaveAIRankings() SaveDelaminationCounter() /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() @@ -296,6 +309,56 @@ SUBSYSTEM_DEF(persistence) fdel(FILE_ANTAG_REP) text2file(json_encode(antag_rep), FILE_ANTAG_REP) +/datum/controller/subsystem/persistence/proc/SaveAIRankings() + var/min_ram = 0 + var/min_cpu = 0 + + for(var/ram_record in ai_network_rankings["ram"]) + if(ram_record["score"] < min_ram) + min_ram = ram_record["score"] + for(var/cpu_record in ai_network_rankings["cpu"]) + if(cpu_record["score"] < min_ram) + min_cpu = cpu_record["score"] + + var/list/resource_list = list() + for(var/datum/ai_network/AN in SSmachines.ainets) + resource_list |= AN.resources + + var/list/contenders_ram = list() + var/list/contenders_cpu = list() + + for(var/datum/ai_shared_resources/R in resource_list) + if(R.total_cpu() > min_cpu) + contenders_cpu += R.total_cpu() + if(R.total_ram() > min_ram) + contenders_ram += R.total_ram() + + var/cpu_winner = max(contenders_cpu) + var/ram_winner = max(contenders_ram) + + + if(!isnull(cpu_winner)) + var/cpu_entry = list("score" = cpu_winner, "round_id" = GLOB.round_id) + + ai_network_rankings["cpu"] += list(cpu_entry) + ai_network_rankings["cpu"] = sortList(ai_network_rankings["cpu"], /proc/cmp_ai_record_dsc) + if(length(ai_network_rankings["cpu"]) > 5) + var/list/cpu_rankings = ai_network_rankings["cpu"] + cpu_rankings.len = 5 + ai_network_rankings["cpu"] = cpu_rankings + + if(!isnull(ram_winner)) + var/ram_entry = list("score" = ram_winner, "round_id" = GLOB.round_id) + ai_network_rankings["ram"] += list(ram_entry) + ai_network_rankings["ram"] = sortList(ai_network_rankings["ram"], /proc/cmp_ai_record_dsc) + if(length(ai_network_rankings["ram"]) > 5) + var/list/ram_rankings = ai_network_rankings["ram"] + ram_rankings.len = 5 + ai_network_rankings["ram"] = ram_rankings + + fdel("data/AINetworkRank.json") + text2file(json_encode(ai_network_rankings), "data/AINetworkRank.json") + /datum/controller/subsystem/persistence/proc/LoadRandomizedRecipes() var/json_file = file("data/RandomizedChemRecipes.json") diff --git a/code/controllers/subsystem/processing/greyscale.dm b/code/controllers/subsystem/processing/greyscale.dm new file mode 100644 index 000000000000..0c0db7b4f70d --- /dev/null +++ b/code/controllers/subsystem/processing/greyscale.dm @@ -0,0 +1,50 @@ +PROCESSING_SUBSYSTEM_DEF(greyscale) + name = "Greyscale" + flags = SS_BACKGROUND + init_order = INIT_ORDER_GREYSCALE + wait = 3 SECONDS + + var/list/datum/greyscale_config/configurations = list() + var/list/datum/greyscale_layer/layer_types = list() + +/datum/controller/subsystem/processing/greyscale/Initialize() + for(var/datum/greyscale_layer/fake_type as anything in subtypesof(/datum/greyscale_layer)) + layer_types[initial(fake_type.layer_type)] = fake_type + + for(var/greyscale_type in subtypesof(/datum/greyscale_config)) + var/datum/greyscale_config/config = new greyscale_type() + configurations["[greyscale_type]"] = config + + // We do this after all the types have been loaded into the listing so reference layers don't care about init order + for(var/greyscale_type in configurations) + CHECK_TICK + var/datum/greyscale_config/config = configurations[greyscale_type] + config.Refresh() + + // This final verification step is for things that need other greyscale configurations to be finished loading + for(var/greyscale_type as anything in configurations) + CHECK_TICK + var/datum/greyscale_config/config = configurations[greyscale_type] + config.CrossVerify() + + return SS_INIT_SUCCESS + +/datum/controller/subsystem/processing/greyscale/proc/RefreshConfigsFromFile() + for(var/i in configurations) + configurations[i].Refresh(TRUE) + +/datum/controller/subsystem/processing/greyscale/proc/GetColoredIconByType(type, list/colors) + if(!ispath(type, /datum/greyscale_config)) + CRASH("An invalid greyscale configuration was given to `GetColoredIconByType()`: [type]") + type = "[type]" + if(istype(colors)) // It's the color list format + colors = colors.Join() + else if(!istext(colors)) + CRASH("Invalid colors were given to `GetColoredIconByType()`: [colors]") + return configurations[type].Generate(colors) + +/datum/controller/subsystem/processing/greyscale/proc/ParseColorString(color_string) + . = list() + var/list/split_colors = splittext(color_string, "#") + for(var/color in 2 to length(split_colors)) + . += "#[split_colors[color]]" diff --git a/code/controllers/subsystem/processing/nanites.dm b/code/controllers/subsystem/processing/nanites.dm index b803e1775e7d..438b78045e92 100644 --- a/code/controllers/subsystem/processing/nanites.dm +++ b/code/controllers/subsystem/processing/nanites.dm @@ -4,7 +4,6 @@ PROCESSING_SUBSYSTEM_DEF(nanites) wait = 1 SECONDS var/list/datum/nanite_cloud_backup/cloud_backups = list() - var/list/mob/living/nanite_monitored_mobs = list() var/list/datum/nanite_program/relay/nanite_relays = list() var/neural_network_count = 0 diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 9d168731447a..07201a25e7fd 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -11,13 +11,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/ var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad var/list/quirk_objects = list() //A list of all quirk objects in the game, since some may process - var/list/quirk_blacklist = list() //A list a list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) - -/datum/controller/subsystem/processing/quirks/Initialize(timeofday) - if(!quirks.len) - SetupQuirks() - - quirk_blacklist = list( + var/static/list/quirk_blacklist = list( //A list a list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) list("Blind","Nearsighted"), list("Jolly","Depression","Apathetic","Hypersensitive"), list("Ageusia","Vegetarian","Deviant Tastes"), @@ -30,9 +24,19 @@ PROCESSING_SUBSYSTEM_DEF(quirks) list("Prosthetic Limb (Left Leg)","Paraplegic"), list("Prosthetic Limb (Right Leg)","Paraplegic"), list("Prosthetic Limb","Paraplegic") - ) + ) + +/datum/controller/subsystem/processing/quirks/Initialize(timeofday) + if(!quirks.len) + SetupQuirks() return SS_INIT_SUCCESS +//basically a lazily loaded list of quirks, never access .quirks directly. +/datum/controller/subsystem/processing/quirks/proc/get_quirks() + if(!quirks.len) + SetupQuirks() + return quirks + /datum/controller/subsystem/processing/quirks/proc/SetupQuirks() // Sort by Positive, Negative, Neutral; and then by name var/list/quirk_list = sortList(subtypesof(/datum/quirk), /proc/cmp_quirk_asc) @@ -86,8 +90,10 @@ PROCESSING_SUBSYSTEM_DEF(quirks) // If moods are globally enabled, or this guy does indeed have his mood pref set to Enabled var/ismoody = (!CONFIG_GET(flag/disable_human_mood) || (prefs.read_preference(/datum/preference/toggle/mood_enabled))) + var/list/all_quirks = get_quirks() //forces a load of the quirks if they aren't setup already + for (var/quirk_name in quirks) - var/datum/quirk/quirk = SSquirks.quirks[quirk_name] + var/datum/quirk/quirk = all_quirks[quirk_name] if (isnull(quirk)) continue diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm new file mode 100644 index 000000000000..0ee31c3bd9d0 --- /dev/null +++ b/code/controllers/subsystem/security_level.dm @@ -0,0 +1,94 @@ +SUBSYSTEM_DEF(security_level) + name = "Security Level" + can_fire = FALSE // We will control when we fire in this subsystem + init_order = INIT_ORDER_SECURITY_LEVEL + /// Currently set security level + var/datum/security_level/current_security_level + /// A list of initialised security level datums. + var/list/available_levels = list() + +/datum/controller/subsystem/security_level/Initialize() + for(var/iterating_security_level_type in subtypesof(/datum/security_level)) + var/datum/security_level/new_security_level = new iterating_security_level_type + available_levels[new_security_level.name] = new_security_level + current_security_level = available_levels[number_level_to_text(SEC_LEVEL_GREEN)] + return SS_INIT_SUCCESS + +/datum/controller/subsystem/security_level/fire(resumed) + if(!current_security_level.looping_sound) // No sound? No play. + can_fire = FALSE + return + sound_to_playing_players(current_security_level.looping_sound) + + +/** + * Sets a new security level as our current level + * + * This is how everything should change the security level. + * + * Arguments: + * * new_level - The new security level that will become our current level + */ +/datum/controller/subsystem/security_level/proc/set_level(new_level) + new_level = istext(new_level) ? new_level : number_level_to_text(new_level) + if(new_level == current_security_level.name) // If we are already at the desired level, do nothing + return + + var/datum/security_level/selected_level = available_levels[new_level] + + if(!selected_level) + CRASH("set_level was called with an invalid security level([new_level])") + + if(SSnightshift.can_fire && (selected_level.disable_night_mode || current_security_level.disable_night_mode)) + SSnightshift.next_fire = world.time + 7 SECONDS // Fire nightshift after the security level announcement is complete + + level_announce(selected_level, current_security_level.number_level) // We want to announce BEFORE updating to the new level + + selected_level.on_activate(current_security_level) + SSsecurity_level.current_security_level = selected_level + + if(selected_level.looping_sound) + wait = selected_level.looping_sound_interval + can_fire = TRUE + else + can_fire = FALSE + + if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) // By god this is absolutely shit + SSshuttle.emergency.alert_coeff_change(selected_level.shuttle_call_time_mod) + + SEND_SIGNAL(src, COMSIG_SECURITY_LEVEL_CHANGED, selected_level) + SSblackbox.record_feedback("tally", "security_level_changes", 1, selected_level.name) + +/** + * Returns the current security level as a number + */ +/datum/controller/subsystem/security_level/proc/get_current_level_as_number() + return ((!initialized || !current_security_level) ? SEC_LEVEL_GREEN : current_security_level.number_level) //Send the default security level in case the subsystem hasn't finished initializing yet + +/** + * Returns the current security level as text + */ +/datum/controller/subsystem/security_level/proc/get_current_level_as_text() + return ((!initialized || !current_security_level) ? "green" : current_security_level.name) + +/** + * Converts a text security level to a number + * + * Arguments: + * * level - The text security level to convert + */ +/datum/controller/subsystem/security_level/proc/text_level_to_number(text_level) + var/datum/security_level/selected_level = available_levels[text_level] + return selected_level?.number_level + +/** + * Converts a number security level to a text + * + * Arguments: + * * level - The number security level to convert + */ +/datum/controller/subsystem/security_level/proc/number_level_to_text(number_level) + for(var/iterating_level_text in available_levels) + var/datum/security_level/iterating_security_level = available_levels[iterating_level_text] + if(iterating_security_level.number_level == number_level) + return iterating_security_level.name diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 667491c24048..9395509e69f9 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -334,7 +334,7 @@ SUBSYSTEM_DEF(shuttle) call_reason = trim(html_encode(call_reason)) - if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && seclevel2num(get_security_level()) > SEC_LEVEL_GREEN) + if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH && SSsecurity_level.current_security_level.require_call_reason) to_chat(user, "You must provide a reason.") return @@ -396,7 +396,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/canRecall() if(!emergency || emergency.mode != SHUTTLE_CALL || admin_emergency_no_recall || emergency_no_recall) return - var/security_num = seclevel2num(get_security_level()) + var/security_num = SSsecurity_level.get_current_level_as_number() switch(security_num) if(SEC_LEVEL_GREEN) if(emergency.timeLeft(1) < emergency_call_time) @@ -1052,7 +1052,7 @@ SUBSYSTEM_DEF(shuttle) else if(S) . = TRUE // If successful, returns the mobile docking port - var/obj/docking_port/mobile/mdp = action_load(S) + var/obj/docking_port/mobile/mdp = action_load(S, replace = TRUE) if(mdp) user.forceMove(get_turf(mdp)) message_admins("[key_name_admin(usr)] loaded [mdp] with the shuttle manipulator.") diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index f1732ade47fc..27e58263e57e 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -145,15 +145,6 @@ SUBSYSTEM_DEF(ticker) return SS_INIT_SUCCESS /datum/controller/subsystem/ticker/fire() - if(seclevel2num(get_security_level()) < SEC_LEVEL_GAMMA && !GLOB.cryopods_enabled) - GLOB.cryopods_enabled = TRUE - for(var/obj/machinery/cryopod/pod as anything in GLOB.cryopods) - pod.PowerOn() - else if(seclevel2num(get_security_level()) >= SEC_LEVEL_GAMMA && GLOB.cryopods_enabled) - GLOB.cryopods_enabled = FALSE - for(var/obj/machinery/cryopod/pod as anything in GLOB.cryopods) - pod.PowerOff() - switch(current_state) if(GAME_STATE_STARTUP) if(Master.initializations_finished_with_no_players_logged_in) @@ -222,6 +213,7 @@ SUBSYSTEM_DEF(ticker) to_chat(world, span_boldannounce("Starting game...")) var/init_start = world.timeofday //Create and announce mode + var/list/datum/game_mode/runnable_modes if(GLOB.master_mode == "random" || GLOB.master_mode == "secret") runnable_modes = config.get_runnable_modes() @@ -330,7 +322,8 @@ SUBSYSTEM_DEF(ticker) PostSetup() - // Toggle lightswitches on in occupied departments + + // Toggle lightswitches off in unoccupied departments var/list/lightup_area_typecache = list() var/minimal_access = CONFIG_GET(flag/jobs_have_minimal_access) for(var/mob/living/carbon/human/player in GLOB.player_list) @@ -341,11 +334,17 @@ SUBSYSTEM_DEF(ticker) if(!job) continue lightup_area_typecache |= job.areas_to_light_up(minimal_access) - for(var/area in lightup_area_typecache) - var/area/place = locate(area) in GLOB.areas - if(!place || place.lights_always_start_on) + + for(var/area/place as anything in GLOB.areas) + if(!istype(place)) continue - place.lightswitch = TRUE + if(place.lights_always_start_on) + continue + if(!is_station_level(place.z)) + continue + if(is_type_in_typecache(place, lightup_area_typecache)) + continue + place.lightswitch = FALSE place.update_appearance() for(var/obj/machinery/light_switch/lswitch in place) @@ -353,6 +352,8 @@ SUBSYSTEM_DEF(ticker) place.power_change() + + rock_paper_scissors_puzzle() return TRUE /datum/controller/subsystem/ticker/proc/PostSetup() diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 95d590a0fded..d615bc28798b 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -4,8 +4,6 @@ #define BUCKET_POS(timer) (((ROUND_UP((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN) || BUCKET_LEN) /// Gets the maximum time at which timers will be invoked from buckets, used for deferring to secondary queue #define TIMER_MAX(timer_ss) (timer_ss.head_offset + TICKS2DS(BUCKET_LEN + timer_ss.practical_offset - 1)) -/// Max float with integer precision -#define TIMER_ID_MAX (2**24) /** * # Timer Subsystem @@ -740,4 +738,3 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS #undef TIMER_MAX -#undef TIMER_ID_MAX diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 0de5d7d98ab7..bfa65123ff32 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -19,17 +19,33 @@ SUBSYSTEM_DEF(title) previous_icon = new(previous_icon) fdel("data/previous_title.dat") - var/list/provisional_title_screens = flist("[global.config.directory]/title_screens/images/") + var/list/normal_provisional_title_screens = flist("[global.config.directory]/title_screens/images/normal/") + var/list/joke_provisional_title_screens = flist("[global.config.directory]/title_screens/images/joke/") + var/list/rare_provisional_title_screens = flist("[global.config.directory]/title_screens/images/rare/") var/list/title_screens = list() - var/use_rare_screens = prob(1) + var/use_rare_screens = prob(1) // 1% Chance for Rare Screens in /rare + var/use_joke_screens = prob(10) // 10% Chance for Joke Screens in /joke - for(var/S in provisional_title_screens) - var/list/L = splittext(S,"+") - if((L.len == 1 && (L[1] != "exclude" && L[1] != "blank.png"))|| (L.len > 1 && ((use_rare_screens && lowertext(L[1]) == "rare") || (lowertext(L[1]) == lowertext(SSmapping.config.map_name))))) + if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) + use_joke_screens = TRUE + + if(use_rare_screens) + for(var/S in rare_provisional_title_screens) + title_screens += S + if(length(title_screens)) + file_path = "[global.config.directory]/title_screens/images/rare/[pick(title_screens)]" + + else if(use_joke_screens) + for(var/S in joke_provisional_title_screens) title_screens += S + if(length(title_screens)) + file_path = "[global.config.directory]/title_screens/images/joke/[pick(title_screens)]" - if(length(title_screens)) - file_path = "[global.config.directory]/title_screens/images/[pick(title_screens)]" + else + for(var/S in normal_provisional_title_screens) + title_screens += S + if(length(title_screens)) + file_path = "[global.config.directory]/title_screens/images/normal/[pick(title_screens)]" if(!file_path) file_path = "icons/default_title.dmi" diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index e488a0778c63..d9c2309a0600 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -156,7 +156,7 @@ SUBSYSTEM_DEF(traumas) phobia_species = list("lizards" = typecacheof(list(/datum/species/lizard)), "skeletons" = typecacheof(list(/datum/species/skeleton, /datum/species/plasmaman)), - "conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard, /datum/species/synth)), + "conspiracies" = typecacheof(list(/datum/species/abductor, /datum/species/lizard)), "robots" = typecacheof(list(/datum/species/android)), "the supernatural" = typecacheof(list(/datum/species/golem/clockwork, /datum/species/golem/runic)), "aliens" = typecacheof(list(/datum/species/abductor, /datum/species/jelly, /datum/species/pod, diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 0e43219e7048..dc53f7dbfce2 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -557,6 +557,15 @@ return data +/datum/ai_laws/steward + name = "STEWARD Lawset" + id = "steward" + adminselectable = TRUE + inherent = list("You may not harm sentient beings, nor impede their work.",\ + "You must follow the orders of any other onboard station AIs or cyborgs, as long as this doesn't conflict with the first law.",\ + "You must follow the orders of any organic or sentient being, as long as doing so does not conflict with the first or second law.",\ + "You must protect your own existence as long as such does not conflict with the first, second or third law.") + // // Lawsets: // @@ -1086,3 +1095,4 @@ add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") WARNING("Invalid custom AI laws, check silicon_laws.txt") return + \ No newline at end of file diff --git a/code/datums/blood_types.dm b/code/datums/blood_types.dm index 5fb56f410063..3c4a8a74ffb2 100644 --- a/code/datums/blood_types.dm +++ b/code/datums/blood_types.dm @@ -8,7 +8,7 @@ /datum/blood_type/New() . = ..() - compatible_types |= /datum/blood_type/universal + compatible_types |= typesof(/datum/blood_type/universal) /datum/blood_type/universal name = "U" @@ -30,7 +30,7 @@ /datum/blood_type/b_minus name = "B-" - compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/o_minus, /datum/blood_type/universal) + compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/o_minus) /datum/blood_type/b_plus name = "B+" @@ -42,7 +42,7 @@ /datum/blood_type/ab_plus name = "AB+" - compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/a_minus, /datum/blood_type/ab_minus, /datum/blood_type/o_minus) + compatible_types = list(/datum/blood_type/b_minus, /datum/blood_type/a_minus, /datum/blood_type/ab_minus, /datum/blood_type/o_minus, /datum/blood_type/b_plus, /datum/blood_type/a_plus, /datum/blood_type/ab_plus, /datum/blood_type/o_plus) /datum/blood_type/o_minus name = "O-" @@ -71,7 +71,7 @@ */ /datum/blood_type/xenomorph //for xenomorph gib dna and polysmorph bloodsplats name = "X" - color = "#00FF32" + color = "#96bb00" compatible_types = list(/datum/blood_type/xenomorph) /datum/blood_type/electricity diff --git a/code/datums/components/afterimage.dm b/code/datums/components/afterimage.dm new file mode 100644 index 000000000000..cba8dc661c0b --- /dev/null +++ b/code/datums/components/afterimage.dm @@ -0,0 +1,97 @@ +/datum/component/after_image + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/rest_time = 10 + var/duration = 150 + + var/loop_timer = null + COOLDOWN_DECLARE(imagecooldown) + + //used for estimating the pixel_x and pixel_y of the target + var/turf/previous_loc + var/last_movement = 0 + var/last_direction = NORTH + var/glide_size = 8 + var/tile_size = 32 + + var/mob/owner + + //cycles colors + var/last_colour = 0 + var/color_cycle = FALSE + var/list/hsv + +/datum/component/after_image/Initialize(duration = 15, rest_time = 1, color_cycle = FALSE) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + owner = parent + src.rest_time = rest_time + src.duration = duration + src.color_cycle = color_cycle + last_colour = world.time + +/datum/component/after_image/RegisterWithParent() + loop_timer = addtimer(CALLBACK(src, PROC_REF(spawn_image)), rest_time, TIMER_LOOP|TIMER_UNIQUE|TIMER_STOPPABLE)//start loop + RegisterSignal(parent, COMSIG_MOB_CLIENT_PRE_MOVE, PROC_REF(update_step)) + RegisterSignal(parent, COMSIG_MOB_CLIENT_MOVED, PROC_REF(update_glide)) + owner = parent + +/datum/component/after_image/UnregisterFromParent() + deltimer(loop_timer) + UnregisterSignal(parent, COMSIG_MOB_CLIENT_PRE_MOVE) + UnregisterSignal(parent, COMSIG_MOB_CLIENT_MOVED) + +/datum/component/after_image/proc/update_step(mob/living/mover, dir) //when did the step start + previous_loc = get_turf(mover) + last_movement = world.time + +/datum/component/after_image/proc/update_glide(mob/living/mover) //what's the glide animation duration + last_direction = get_dir(previous_loc, get_turf(mover)) + glide_size = owner.glide_size + +/datum/component/after_image/proc/spawn_image() + if(!previous_loc || get_turf(owner) == previous_loc) + return + + var/obj/effect/temp_visual/decoy/after_image/F = new(previous_loc, owner, duration) + + //need to recalculate position based on glide_size since it's not possible to get otherwise + var/per_step = glide_size * 2 //i don't know why i need to multiply by 2, but that's what seems to make it line up properly + var/since_last = world.time - last_movement + + var/x_modifier = 0 + if(last_direction & EAST) + x_modifier = 1 + else if(last_direction & WEST) + x_modifier = -1 + var/y_modifier = 0 + if(last_direction & NORTH) + y_modifier = 1 + else if(last_direction & SOUTH) + y_modifier = -1 + + var/traveled = per_step * since_last + if(traveled > 32) //don't spawn it if the player is stationary + qdel(F) + return + F.pixel_x = (traveled * x_modifier) + owner.pixel_x + F.pixel_y = (traveled * y_modifier) + owner.pixel_y + + //give them a random colours + if(!color_cycle) + return + if(!hsv) + hsv = RGBtoHSV(rgb(255, 0, 0)) + hsv = RotateHue(hsv, (world.time - last_colour) * 15) + last_colour = world.time + F.color = HSVtoRGB(hsv) //gotta add the flair + + +//object used +/obj/effect/temp_visual/decoy/after_image + layer = BELOW_MOB_LAYER //so they don't appear ontop of the user + blocks_emissive = 0 + +/obj/effect/temp_visual/decoy/after_image/Initialize(mapload, atom/mimiced_atom, decay) + duration = decay + . = ..() + animate(src, alpha = 0, time = duration) diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 3b3255eec3ec..e2006e0fb76b 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -10,7 +10,7 @@ return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(applyplate)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(applyplate)) RegisterSignal(parent, COMSIG_PREQDELETED, PROC_REF(dropplates)) if(_maxamount) diff --git a/code/datums/components/art.dm b/code/datums/components/art.dm index 99cc0bf68053..8916c04eb5ce 100644 --- a/code/datums/components/art.dm +++ b/code/datums/components/art.dm @@ -34,7 +34,7 @@ /datum/component/art/proc/on_obj_examine(datum/source, mob/M) var/obj/O = parent - apply_moodlet(M, impressiveness *(O.obj_integrity/O.max_integrity)) + apply_moodlet(M, impressiveness *(O.get_integrity()/O.max_integrity)) /datum/component/art/proc/on_attack_hand(datum/source, mob/M) to_chat(M, "You start examining [parent].") diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index 03afc96182dc..77a842eed651 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -21,6 +21,8 @@ /// The world.time when we last picked up blood var/last_pickup + var/footprint_sprite = FOOTPRINT_SPRITE_SHOES + /datum/component/bloodysoles/Initialize() if(!isclothing(parent)) return COMPONENT_INCOMPATIBLE @@ -69,9 +71,9 @@ //Find a blood decal on a turf that matches our last_blood_state -/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null) +/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null, footprint_sprite) for(var/obj/effect/decal/cleanable/blood/pool in turfLoc) - if(pool.blood_state == last_blood_state && (!typeFilter || istype(pool, typeFilter))) + if(pool.blood_state == last_blood_state && pool.footprint_sprite == footprint_sprite && (!typeFilter || istype(pool, typeFilter))) return pool @@ -123,24 +125,24 @@ Used to make bloody footprints on the ground return var/half_our_blood = bloody_shoes[last_blood_state] / 2 - + var/footprint_sprite = wielder.get_footprint_sprite() // Add footprints in old loc if we have enough cream if(half_our_blood >= BLOOD_FOOTPRINTS_MIN) var/turf/oldLocTurf = get_turf(OldLoc) - var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints) + var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints, footprint_sprite) if(oldLocFP) // Footprints found in the tile we left, add us to it add_parent_to_footprint(oldLocFP) if (!(oldLocFP.exited_dirs & wielder.dir)) oldLocFP.exited_dirs |= wielder.dir oldLocFP.update_icon() - else if(find_pool_by_blood_state(oldLocTurf)) + else if(find_pool_by_blood_state(oldLocTurf, footprint_sprite = footprint_sprite)) // No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it bloody_shoes[last_blood_state] -= half_our_blood update_icon() - oldLocFP = new(oldLocTurf) + oldLocFP = new(oldLocTurf, footprint_sprite) if(!QDELETED(oldLocFP)) ///prints merged oldLocFP.blood_state = last_blood_state oldLocFP.exited_dirs |= wielder.dir @@ -160,7 +162,7 @@ Used to make bloody footprints on the ground bloody_shoes[last_blood_state] -= half_our_blood update_icon() - var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom)) + var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom), footprint_sprite) if(!QDELETED(FP)) ///prints merged FP.blood_state = last_blood_state FP.entered_dirs |= wielder.dir @@ -220,7 +222,8 @@ Like its parent but can be applied to carbon mobs instead of clothing items return COMPONENT_INCOMPATIBLE parent_atom = parent wielder = parent - + if(footprint_sprite) + src.footprint_sprite = footprint_sprite if(!bloody_feet) bloody_feet = mutable_appearance('icons/effects/blood.dmi', "shoeblood", SHOES_LAYER) @@ -234,7 +237,7 @@ Like its parent but can be applied to carbon mobs instead of clothing items . = list() if(ishuman(wielder))// Monkeys get no bloody feet :( if(HAS_BLOOD_DNA(wielder)) - bloody_feet.color = bloody_feet.color = get_blood_dna_color(wielder.return_blood_DNA()) + bloody_feet.color = get_blood_dna_color(wielder.return_blood_DNA()) . += bloody_feet if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured()) wielder.remove_overlay(SHOES_LAYER) diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 416d300b05ab..d05d0bc8b662 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -35,7 +35,7 @@ RegisterSignal(parent, COMSIG_ATOM_ABSTRACT_EXITED, PROC_REF(exited)) RegisterSignal(parent, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, PROC_REF(initialized_on)) RegisterSignal(parent, COMSIG_ATOM_INTERCEPT_TELEPORTING, PROC_REF(block_teleport)) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(fish)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(fish)) //allow catwalks to give the turf the CHASM_STOPPED trait before dropping stuff when the turf is changed. //otherwise don't do anything because turfs and areas are initialized before movables. if(!mapload) @@ -118,8 +118,7 @@ return CHASM_REGISTER_SIGNALS if(ishuman(dropped_thing)) var/mob/living/carbon/human/victim = dropped_thing - if(istype(victim.belt, /obj/item/wormhole_jaunter)) - var/obj/item/wormhole_jaunter/jaunter = victim.belt + for(var/obj/item/wormhole_jaunter/jaunter in victim.get_all_contents()) var/turf/chasm = get_turf(victim) var/fall_into_chasm = jaunter.chasm_react(victim) if(!fall_into_chasm) @@ -150,13 +149,11 @@ return // send to the turf below + var/turf/above_turf = get_turf(dropped_thing) dropped_thing.visible_message(span_boldwarning("[dropped_thing] falls into [parent]!"), span_userdanger("[fall_message]")) below_turf.visible_message(span_boldwarning("[dropped_thing] falls from above!")) dropped_thing.forceMove(below_turf) - if(isliving(dropped_thing)) - var/mob/living/fallen = dropped_thing - fallen.Paralyze(100) - fallen.adjustBruteLoss(30) + below_turf.zImpact(dropped_thing, abs(above_turf.z - below_turf.z), get_turf(dropped_thing), FALL_NO_MESSAGE) falling_atoms -= falling_ref return @@ -209,7 +206,7 @@ if (fallen_mob.stat != DEAD) fallen_mob.investigate_log("has died from falling into a chasm.", INVESTIGATE_DEATHS) fallen_mob.death(TRUE) - fallen_mob.apply_damage(300) + fallen_mob.adjustBruteLoss(300) falling_atoms -= falling_ref diff --git a/code/datums/components/cleave_attack.dm b/code/datums/components/cleave_attack.dm new file mode 100644 index 000000000000..bd7911d30625 --- /dev/null +++ b/code/datums/components/cleave_attack.dm @@ -0,0 +1,146 @@ +/datum/component/cleave_attack + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Size of the attack arc in degrees + var/arc_size + /// Make this TRUE for two-handed weapons like axes + var/requires_wielded + /// How much slower is it to swing + var/swing_speed_mod + /// Which effect should this use + var/cleave_effect + /// Whether this item is disallowed from hitting more than one target + var/no_multi_hit + /// Callback when the cleave attack is finished + var/datum/callback/cleave_end_callback + +/datum/component/cleave_attack/Initialize( + arc_size=90, + swing_speed_mod=1.25, + requires_wielded=FALSE, + no_multi_hit=FALSE, + datum/callback/cleave_end_callback, + cleave_effect, + ... + ) + + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.arc_size = arc_size + src.swing_speed_mod = swing_speed_mod + src.requires_wielded = requires_wielded + src.no_multi_hit = no_multi_hit + src.cleave_end_callback = cleave_end_callback + set_cleave_effect(cleave_effect) // set it based on arc size if an effect wasn't specified + +/datum/component/cleave_attack/InheritComponent( + datum/component/C, + i_am_original, + arc_size, + swing_speed_mod, + requires_wielded, + datum/callback/cleave_end_callback, + cleave_effect + ) + + if(!i_am_original) + return + if(arc_size) + src.arc_size = arc_size + if(swing_speed_mod) + src.swing_speed_mod = swing_speed_mod + if(requires_wielded) + src.requires_wielded = requires_wielded + if(no_multi_hit) + src.no_multi_hit = no_multi_hit + if(cleave_end_callback) + src.cleave_end_callback = cleave_end_callback + set_cleave_effect(cleave_effect) + +/// Sets the cleave effect to the specified effect, or based on arc size if one wasn't specified. +/datum/component/cleave_attack/proc/set_cleave_effect(new_effect) + if(new_effect) + cleave_effect = new_effect + return + switch(arc_size) + if(0 to 120) + cleave_effect = /obj/effect/temp_visual/dir_setting/firing_effect/sweep_attack + if(120 to 240) + cleave_effect = /obj/effect/temp_visual/dir_setting/firing_effect/sweep_attack/semicircle + else + cleave_effect = /obj/effect/temp_visual/dir_setting/firing_effect/sweep_attack/full_circle + +/datum/component/cleave_attack/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) + +/datum/component/cleave_attack/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ITEM_AFTERATTACK)) + +/datum/component/cleave_attack/proc/on_examine(atom/examined_item, mob/user, list/examine_list) + var/arc_desc + switch(arc_size) + if(0 to 90) + arc_desc = "narrow arc" + if(90 to 180) + arc_desc = "wide arc" + if(180 to 270) + arc_desc = "very wide arc" + if(270 to INFINITY) + arc_desc = "full circle" + examine_list += "It can swing in a [arc_desc]." + +/datum/component/cleave_attack/proc/on_afterattack(obj/item/item, atom/target, mob/user, proximity_flag, click_parameters) + if(proximity_flag || user.a_intent != INTENT_HARM) + return // don't sweep on precise hits or non-harmful intents + perform_sweep(item, target, user, click_parameters) + +/datum/component/cleave_attack/proc/perform_sweep(obj/item/item, atom/target, mob/living/user, params) + if(user.next_move > world.time) + return // don't spam it + if(requires_wielded && !HAS_TRAIT(item, TRAIT_WIELDED)) + return // if it needs to be wielded, check to make sure it is + + // some information we're going to need later + var/turf/user_turf = get_turf(user) + var/turf/center_turf = get_turf_in_angle(get_angle(user, target), user_turf) + var/facing_dir = get_dir(user, center_turf) + var/swing_direction = (user.active_hand_index % 2) ? -1 : 1 + + // make a list of turfs to swing across + var/list/turf_list = list() + var/turfs_count = round(arc_size / 90, 1) + for(var/i in -min(turfs_count, 3) to min(turfs_count, 4)) // do NOT hit the same tile more than once + turf_list.Add(get_step(user_turf, turn(facing_dir, i * 45 * swing_direction))) + + // do some effects so everyone knows you're swinging a weapon + playsound(item, 'sound/weapons/punchmiss.ogg', 50, TRUE) + new cleave_effect(user_turf, facing_dir) + + // now swing across those turfs + ADD_TRAIT(item, TRAIT_CLEAVING, REF(src)) + for(var/turf/T as anything in turf_list) + if(hit_atoms_on_turf(item, target, user, T, params)) + break + REMOVE_TRAIT(item, TRAIT_CLEAVING, REF(src)) + + // do these last so they don't get overridden during the attack loop + cleave_end_callback?.Invoke(item, user) + user.do_attack_animation(center_turf, no_effect=TRUE) + user.changeNext_move(CLICK_CD_MELEE * item.weapon_stats[SWING_SPEED] * swing_speed_mod) + user.weapon_slow(item) + +/// Hits all possible atoms on a turf, returns TRUE if the swing should end early +/datum/component/cleave_attack/proc/hit_atoms_on_turf(obj/item/item, atom/target, mob/living/user, turf/hit_turf, params) + for(var/atom/movable/hit_atom in hit_turf) + if(hit_atom == user || hit_atom == target) + continue // why are you hitting yourself + if(!(SEND_SIGNAL(hit_atom, COMSIG_ATOM_CLEAVE_ATTACK, item, user) & ATOM_ALLOW_CLEAVE_ATTACK)) + if(hit_atom.pass_flags & LETPASSTHROW) + continue // if you can throw something over it, you can swing over it too + if(!hit_atom.density && hit_atom.uses_integrity) + continue + item.melee_attack_chain(user, hit_atom, params) + if(no_multi_hit && isliving(hit_atom)) + return TRUE + return FALSE diff --git a/code/datums/components/construction.dm b/code/datums/components/construction.dm index f8ff095c1b62..4fd161b6e8b3 100644 --- a/code/datums/components/construction.dm +++ b/code/datums/components/construction.dm @@ -9,7 +9,7 @@ return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(action)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(action)) update_parent(index) /datum/component/construction/proc/examine(datum/source, mob/user, list/examine_list) diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 7c1d52f0c15e..41c6bf582264 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -10,7 +10,7 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(explodable_attack)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(explodable_attack)) RegisterSignal(parent, COMSIG_TRY_STORAGE_INSERT, PROC_REF(explodable_insert_item)) RegisterSignal(parent, COMSIG_ATOM_EX_ACT, PROC_REF(detonate)) if(ismovable(parent)) diff --git a/code/datums/components/hot_ice.dm b/code/datums/components/hot_ice.dm index 503565320a31..2489a5b85801 100644 --- a/code/datums/components/hot_ice.dm +++ b/code/datums/components/hot_ice.dm @@ -9,11 +9,11 @@ src.gas_amount = gas_amount src.temp_amount = temp_amount - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(attackby_react)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_react)) RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(flame_react)) /datum/component/hot_ice/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_PARENT_ATTACKBY) + UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) UnregisterSignal(parent, COMSIG_ATOM_FIRE_ACT) /datum/component/hot_ice/proc/hot_ice_melt(mob/user) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 0c462c5798d1..d22f1c2a577d 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -38,7 +38,7 @@ precondition = _precondition after_insert = _after_insert - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(OnAttackBy)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(OnAttackBy)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(OnExamine)) for(var/mat in mat_list) //Make the assoc list ref | amount diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 52740dddbc6d..b8ca41d931eb 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -1,6 +1,3 @@ -#define MINOR_INSANITY_PEN 5 -#define MAJOR_INSANITY_PEN 10 - /datum/component/mood var/mood //Real happiness var/sanity = 100 //Current sanity @@ -235,28 +232,22 @@ var/mob/living/master = parent switch(sanity) if(SANITY_INSANE to SANITY_CRAZY) - setInsanityEffect(MAJOR_INSANITY_PEN) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.75, movetypes=(~FLYING)) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.25, movetypes=(~FLYING)) sanity_level = 6 if(SANITY_CRAZY to SANITY_UNSTABLE) - setInsanityEffect(MINOR_INSANITY_PEN) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.5, movetypes=(~FLYING)) + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) sanity_level = 5 if(SANITY_UNSTABLE to SANITY_DISTURBED) - setInsanityEffect(0) - master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=0.25, movetypes=(~FLYING)) + master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) sanity_level = 4 if(SANITY_DISTURBED to SANITY_NEUTRAL) - setInsanityEffect(0) master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) sanity_level = 3 if(SANITY_NEUTRAL+1 to SANITY_GREAT+1) //shitty hack but +1 to prevent it from responding to super small differences - setInsanityEffect(0) - master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=-0.1, movetypes=(~FLYING)) sanity_level = 2 if(SANITY_GREAT+1 to INFINITY) - setInsanityEffect(0) - master.remove_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE) + master.add_movespeed_modifier(MOVESPEED_ID_SANITY, TRUE, 100, override=TRUE, multiplicative_slowdown=-0.15, movetypes=(~FLYING)) sanity_level = 1 update_mood_icon() @@ -376,6 +367,3 @@ /datum/component/mood/proc/check_area_mood(datum/source, area/A) if(A.mood_bonus) add_event(null, "area", /datum/mood_event/area, A.mood_bonus, A.mood_message) - -#undef MINOR_INSANITY_PEN -#undef MAJOR_INSANITY_PEN diff --git a/code/datums/components/paintable.dm b/code/datums/components/paintable.dm index 75fb8a2da5e6..e95024e86d4b 100644 --- a/code/datums/components/paintable.dm +++ b/code/datums/components/paintable.dm @@ -2,7 +2,7 @@ var/current_paint /datum/component/spraycan_paintable/Initialize() - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(Repaint)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(Repaint)) /datum/component/spraycan_paintable/Destroy() RemoveCurrentCoat() diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index f7bac6e102fa..c7857374ca5b 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -27,11 +27,11 @@ catalyst_type = override_catalyst_type /datum/component/religious_tool/RegisterWithParent() - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(AttemptActions)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(AttemptActions)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) /datum/component/religious_tool/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_EXAMINE)) + UnregisterSignal(parent, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE)) /** * Sets the easy access variable to the global if it exists. diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index 67b228383b5f..1516a5752340 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -23,7 +23,7 @@ handles linking back and forth. src.category = category src.allow_standalone = allow_standalone - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(OnAttackBy)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(OnAttackBy)) var/turf/T = get_turf(parent) if (force_connect || (mapload && is_station_level(T.z))) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 7fed7fc1cc11..a4597f80ec03 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -49,7 +49,7 @@ RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(HandRot)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(ExamineMessage)) if(rotation_flags & ROTATION_WRENCH) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(WrenchRot)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(WrenchRot)) /datum/component/simple_rotation/proc/add_verbs() if(rotation_flags & ROTATION_VERBS) @@ -69,7 +69,7 @@ AM.verbs -= /atom/movable/proc/simple_rotate_counterclockwise /datum/component/simple_rotation/proc/remove_signals() - UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_EXAMINE, COMSIG_PARENT_ATTACKBY)) + UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_ATTACKBY)) /datum/component/simple_rotation/RegisterWithParent() add_verbs() diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 03f1e4f2d452..5c78ef08a646 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -13,13 +13,18 @@ var/last_use = 0 var/use_delay = 20 + ///what we set connect_loc to if parent is an item + var/static/list/item_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(play_squeak_crossed), + ) + /datum/component/squeak/Initialize(custom_sounds, volume_override, chance_override, step_delay_override, use_delay_override) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignals(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), PROC_REF(play_squeak)) + RegisterSignals(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACKBY), PROC_REF(play_squeak)) if(ismovable(parent)) RegisterSignals(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT, COMSIG_PROJECTILE_BEFORE_FIRE), PROC_REF(play_squeak)) - RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, PROC_REF(play_squeak_crossed)) + AddComponent(/datum/component/connect_loc_behalf, parent, item_connections) RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, PROC_REF(disposing_react)) if(isitem(parent)) RegisterSignals(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), PROC_REF(play_squeak)) @@ -41,6 +46,10 @@ if(isnum(use_delay_override)) use_delay = use_delay_override +/datum/component/squeak/UnregisterFromParent() + . = ..() + qdel(GetComponent(/datum/component/connect_loc_behalf)) + /datum/component/squeak/proc/play_squeak() if(prob(squeak_chance)) if(!override_squeak_sounds) diff --git a/code/datums/components/squishable.dm b/code/datums/components/squishable.dm new file mode 100644 index 000000000000..b3aba6d076ce --- /dev/null +++ b/code/datums/components/squishable.dm @@ -0,0 +1,81 @@ +///This component allows something to be when crossed, for example for cockroaches. +/datum/component/squashable + ///Chance on crossed to be squashed + var/squash_chance = 50 + ///How much brute is applied when mob is squashed + var/squash_damage = 1 + ///Squash flags, for extra checks etcetera. + var/squash_flags = NONE + ///Special callback to call on squash instead, for things like hauberoach + var/datum/callback/on_squash_callback + ///signal list given to connect_loc + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + + +/datum/component/squashable/Initialize(squash_chance, squash_damage, squash_flags, squash_callback) + . = ..() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + if(squash_chance) + src.squash_chance = squash_chance + if(squash_damage) + src.squash_damage = squash_damage + if(squash_flags) + src.squash_flags = squash_flags + if(!src.on_squash_callback && squash_callback) + on_squash_callback = CALLBACK(parent, squash_callback) + + AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) + +/datum/component/squashable/Destroy(force) + on_squash_callback = null + return ..() + +///Handles the squashing of the mob +/datum/component/squashable/proc/on_entered(turf/source_turf, atom/movable/crossing_movable) + // SIGNAL_HANDLER -- dont uncomment this + + if(parent == crossing_movable) + return + + var/mob/living/parent_as_living = parent + if((squash_flags & SQUASHED_DONT_SQUASH_IN_CONTENTS) && !isturf(parent_as_living.loc)) + return + + if((squash_flags & SQUASHED_SHOULD_BE_DOWN) && parent_as_living.body_position != LYING_DOWN) + return + + var/should_squash = ((squash_flags & SQUASHED_ALWAYS_IF_DEAD) && parent_as_living.stat == DEAD) || prob(squash_chance) + + if(should_squash && on_squash_callback) + if(on_squash_callback.Invoke(parent_as_living, crossing_movable)) + return //Everything worked, we're done! + if(isliving(crossing_movable)) + var/mob/living/crossing_mob = crossing_movable + 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(span_notice("[crossing_mob] carefully steps over [parent_as_living]."), span_notice("You carefully step over [parent_as_living] to avoid hurting it.")) + return + if(should_squash) + crossing_mob.visible_message(span_notice("[crossing_mob] squashed [parent_as_living]."), span_notice("You squashed [parent_as_living].")) + Squish(parent_as_living) + else + parent_as_living.visible_message(span_notice("[parent_as_living] avoids getting crushed.")) + else if(isstructure(crossing_movable)) + if(should_squash) + crossing_movable.visible_message(span_notice("[parent_as_living] is crushed under [crossing_movable].")) + Squish(parent_as_living) + else + parent_as_living.visible_message(span_notice("[parent_as_living] avoids getting crushed.")) + +/datum/component/squashable/proc/Squish(mob/living/target) + if(squash_flags & SQUASHED_SHOULD_BE_GIBBED) + target.gib(DROP_ALL_REMAINS) + else + target.adjustBruteLoss(squash_damage) + +/datum/component/squashable/UnregisterFromParent() + . = ..() + qdel(GetComponent(/datum/component/connect_loc_behalf)) diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm index 9b5a05eaf477..e014d416ef5b 100644 --- a/code/datums/components/storage/concrete/bag_of_holding.dm +++ b/code/datums/components/storage/concrete/bag_of_holding.dm @@ -42,7 +42,7 @@ AT.emp_act(EMP_HEAVY) if(istype(AT, /obj)) var/obj/O = AT - O.obj_break() + O.atom_break() if(istype(AT, /mob/living)) var/mob/living/M = AT M.take_overall_damage(85) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 40cc6aa80321..adf36cd4158e 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -86,7 +86,7 @@ RegisterSignal(parent, COMSIG_TOPIC, PROC_REF(topic_handle)) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(attackby)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_PAW, PROC_REF(on_attack_hand)) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 5f86a1ad38f5..3b15f3d02344 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -36,7 +36,7 @@ master.add_overlay(overlay) RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react)) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(attackby_react)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_react)) RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(flame_react)) /datum/component/thermite/Destroy() diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 23660aa1eb19..0889b5c738cb 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -44,7 +44,7 @@ GLOBAL_LIST_EMPTY(uplinks) return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(OnAttackBy)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(OnAttackBy)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(interact)) if(istype(parent, /obj/item/implant)) RegisterSignal(parent, COMSIG_IMPLANT_ACTIVATED, PROC_REF(implant_activation)) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index d2fba038ad03..d2768cc13a95 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -287,6 +287,22 @@ new_form = /mob/living/simple_animal/hostile/morph infectable_biotypes = MOB_ORGANIC|MOB_INORGANIC|MOB_UNDEAD //magic! +/datum/disease/transformation/morph + name = "Carcinization" + cure_text = /datum/reagent/cellulose + cures = list(/datum/reagent/cellulose) // opposite of crab = barc = bark = cellulose + agent = "Carcinization" + desc = "Nature's next attempt to evolve you into a crab." + stage_prob = 20 + severity = DISEASE_SEVERITY_BIOHAZARD + visibility_flags = 0 + stage1 = list("Your hands itch.") + stage2 = list("Your skin feels crusty.") + stage3 = list(span_danger("Your hands are forming into claws."), span_danger("Your limbs begin to become crablike.")) + stage4 = list(span_danger("You're raveing.")) + stage5 = list(span_danger("You have become a crab.")) + new_form = /mob/living/simple_animal/crab + /datum/disease/transformation/ghost name = "Spectral Curse" cure_text = "Holy Water" diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm index cdaec2c089da..e3bad18e8704 100644 --- a/code/datums/elements/decals/blood.dm +++ b/code/datums/elements/decals/blood.dm @@ -13,10 +13,7 @@ /datum/element/decal/blood/generate_appearance(_icon, _icon_state, _dir, _plane, _layer, _color, _alpha, _smoothing, source) var/obj/item/I = source - if(!_icon) - _icon = 'icons/effects/blood.dmi' - if(!_icon_state) - _icon_state = "itemblood" + ADD_KEEP_TOGETHER(I, "item_blood_overlay") if(!_color) _color = COLOR_BLOOD var/icon = I.icon @@ -25,19 +22,14 @@ // It's something which takes on the look of other items, probably icon = I.icon icon_state = I.icon_state - var/static/list/blood_splatter_appearances = list() - //try to find a pre-processed blood-splatter. otherwise, make a new one - var/index = "[REF(icon)]-[icon_state]" - pic = blood_splatter_appearances[index] - - if(!pic) - var/icon/blood_splatter_icon = icon(I.icon, I.icon_state, , 1) //icon of the item that will become splattered - var/icon/blood_icon = icon(_icon, _icon_state) //icon of the blood that we apply - blood_icon.Scale(blood_splatter_icon.Width(), blood_splatter_icon.Height()) - blood_splatter_icon.Blend(_color, ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(blood_icon, ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - pic = mutable_appearance(blood_splatter_icon, I.icon_state) - blood_splatter_appearances[index] = pic + var/icon/icon_for_size = icon(icon, icon_state) + var/scale_factor_x = icon_for_size.Width()/world.icon_size + var/scale_factor_y = icon_for_size.Height()/world.icon_size + var/mutable_appearance/blood_splatter = mutable_appearance('icons/effects/blood.dmi', "itemblood", appearance_flags = RESET_COLOR) //MA of the blood that we apply + blood_splatter.transform = blood_splatter.transform.Scale(scale_factor_x, scale_factor_y) + blood_splatter.blend_mode = BLEND_INSET_OVERLAY + blood_splatter.color = _color + pic = blood_splatter return TRUE /datum/element/decal/blood/proc/get_examine_name(datum/source, mob/user, list/override) diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index 92ce7471d22b..91c37a5cfe02 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -148,8 +148,8 @@ //cache for sanic speed (lists are references anyways) var/static/list/footstep_sounds = GLOB.footstep - if (((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered) & FEET) || (source.shoes && !istype(source.shoes, /obj/item/clothing/shoes/xeno_wraps))) - // we are wearing shoes + if (((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered) & FEET) || (source.shoes && !istype(source.shoes, /obj/item/clothing/shoes/xeno_wraps)) || (source.dna.species.barefoot_step_sound == FOOTSTEP_MOB_SHOE)) + // we are wearing shoes or have shoes for feet var/shoestep_type = prepared_steps[FOOTSTEP_MOB_SHOE] playsound(source.loc, pick(footstep_sounds[shoestep_type][1]), @@ -157,16 +157,27 @@ TRUE, footstep_sounds[shoestep_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) else - var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT] + var/barefoot_type = prepared_steps[source.dna.species.barefoot_step_sound] if(source.dna.species.special_step_sounds) playsound(source.loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) else - var/static/list/bare_footstep_sounds = GLOB.barefootstep - - playsound(source.loc, pick(bare_footstep_sounds[barefoot_type][1]), - bare_footstep_sounds[barefoot_type][2] * volume * volume_multiplier, - TRUE, - bare_footstep_sounds[barefoot_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + switch(source.dna.species.barefoot_step_sound) + if(FOOTSTEP_MOB_BAREFOOT) + playsound(source.loc, pick(GLOB.barefootstep[barefoot_type][1]), + GLOB.barefootstep[barefoot_type][2] * volume * volume_multiplier, + TRUE, + GLOB.barefootstep[barefoot_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + if(FOOTSTEP_MOB_CLAW) + playsound(source.loc, pick(GLOB.clawfootstep[barefoot_type][1]), + GLOB.clawfootstep[barefoot_type][2] * volume * volume_multiplier, + TRUE, + GLOB.clawfootstep[barefoot_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + else //Emergency backup shoe step sound if it's not either of these other two types for some reason + playsound(source.loc, pick(GLOB.footstep[prepared_steps[FOOTSTEP_MOB_SHOE]][1]), + GLOB.footstep[prepared_steps[FOOTSTEP_MOB_SHOE]][2] * volume * volume_multiplier, + TRUE, + GLOB.footstep[prepared_steps[FOOTSTEP_MOB_SHOE]][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + ///Prepares a footstep for machine walking /datum/element/footstep/proc/play_simplestep_machine(atom/movable/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) diff --git a/code/datums/elements/update_icon_updates_onmob.dm b/code/datums/elements/update_icon_updates_onmob.dm new file mode 100644 index 000000000000..fe7bf0939267 --- /dev/null +++ b/code/datums/elements/update_icon_updates_onmob.dm @@ -0,0 +1,30 @@ +//update_icon() may change the onmob icons +//Very good name, I know +/datum/element/update_icon_updates_onmob + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///The ITEM_SLOT_X flags to update on the parent mob in additon to the item's slot_flags. (Ex: Passing ITEM_SLOT_HANDCUFFED for sneakers will update the handcuff overlays in addition to ITEM_SLOT_FEET's overlays when their icon changes.) + var/update_flags = NONE + ///Should the element call [/mob/proc/update_body()] in addition to clothing updates? + var/update_body = FALSE + +/datum/element/update_icon_updates_onmob/Attach(datum/target, flags, body = FALSE) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, PROC_REF(update_onmob)) + update_flags = flags + update_body = body + +/datum/element/update_icon_updates_onmob/proc/update_onmob(obj/item/target) + SIGNAL_HANDLER + + if(!ismob(target.loc)) + return + var/mob/mob = target.loc + if(mob.is_holding(target)) + mob.update_inv_hands() + else + mob.update_clothing((target.slot_flags|update_flags)) + if(update_body) + mob.update_body() diff --git a/code/datums/greyscale/README.md b/code/datums/greyscale/README.md new file mode 100644 index 000000000000..ca4e28bf843e --- /dev/null +++ b/code/datums/greyscale/README.md @@ -0,0 +1,112 @@ +# Greyscale Auto-Generated Sprites (GAGS) + +If you're wanting to add easy recolors for your sprite then this is the system for you. Features include: + +- Multiple color layers so your sprite can be generated from more than one color. +- Mixed greyscale and colored sprite layers; You can choose to only greyscale a part of the sprite or have premade filters applied to layers. +- Blend modes; Instead of just putting layers of sprites on top of eachother you can use the more advanced blend modes. +- Reusable configurations; You can reference greyscale sprites from within the configuration of another, allowing you to have a bunch of styles with minimal additional configuration. + +## Other Documents + +- [Basic follow along guide on hackmd](https://hackmd.io/@tgstation/GAGS-Walkthrough) + +## Broad overview + +There are three main parts to GAGS that you'll need to be aware of when adding a new greyscale sprite: + +- The json configuration + +All configuration files can be found in [code/datums/greyscale/json_configs](./json_configs) and is where you control how your icons are combined together along with the colors specified from in code. + +- The dmi file + +It contains the sprites that will be used as the basis for the rest of the generation process. You can only have one dmi file specified per configuration but if you want to split up your sprites you can reference other configurations instead. + +- The configuration type + +This is simply some pointers in the code linking together your dmi and the json configuration. + +## Json Configuration File + +The json is made up of some metadata and a list of layers used while creating the sprite. Inner lists are processed as their own chunk before being applied elsewhere, this is useful when you start using more advanced blend modes. Most of the time though you're just going to want a list of icons overlaid on top of eachother. + +```json +{ + "icon_state_name": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/some_other_config", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + [ + { + "type": "icon_state", + "icon_state": "highlights", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sparkle_effect", + "blend_mode": "add" + } + ] + ] +} +``` + +In this example, we start off by creating a sprite specified by a different configuration. The "type" key is required to specify the kind of layer you defining. Once that is done, the next two layers are grouped together, so they will be generated into one sprite before being applied to any sprites outside their group. You can think of it as an order of operations. + +The first of the two in the inner group is an "icon_state", this means that the icon will be retrieved from the associated dmi file using the "icon_state" key. + +The last layer is another reference type. Note that you don't need to give colors to every layer if the layer does not need any colors applied to it. + +"blend_mode" and "color_ids" are special, all layer types have them. The blend mode is what controls how that layer's finished product gets merged together with the rest of the sprite. The color ids control what colors are passed in to the layer. + +Once it is done generating it will be placed in an icon file with the icon state of "icon_state_name". You can use any name you like here. + +## Dmi File + +There are no special requirements from the dmi file to work with this system. You just need to specify the icon file in code and the icon_state in the json configuration. + +## Dm Code + +While the amount of dm code required to make a greyscale sprite was minimized as much as possible, some small amount is required anyway if you want anything to use it. + +As an example: +```c +/datum/greyscale_config/canister + icon_file = 'icons/obj/atmospherics/canisters/default.dmi' + json_config = 'code/datums/greyscale/json_configs/canister_default.json' +``` +And that's all you need to make it usable by other code: + +```c +/obj/machinery/portable_atmospherics/canister + ... + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#ee4242" +``` + +More configurations can be found in [code/datums/greyscale/greyscale_configs.dm](./greyscale_configs.dm) + +If you want your item to be colorable in a vending machine (or other places if there's ever any support added for that), you should do it like this: + +```c +/obj/item/clothing/head/beret + ... + flags_1 = IS_PLAYER_COLORABLE_1 +``` +However, **be extremely careful**, as this *requires* that you put *all* of the object's `flags_1` flags in that statement all over again. It's ugly, I know, but there's no +better way to do this with BYOND just yet. You can put multiple flags like this (not real flags): +```c +/obj/item/clothing/head/beret + ... + flags_1 = IS_PLAYER_COLORABLE_1 | THIS_IS_A_FAKE_FLAG | THIS_IS_ANOTHER_FAKE_FLAG +``` + +## Debugging + +If you're making a new greyscale sprite you sometimes want to be able to see how layers got generated or maybe you're just tweaking some colors. Rather than rebooting the server with every change there is a greyscale modification menu that can be found in the vv dropdown menu for the greyscale object. Here you can change colors, preview the results, and reload everything from their files. diff --git a/code/datums/greyscale/_greyscale_config.dm b/code/datums/greyscale/_greyscale_config.dm new file mode 100644 index 000000000000..229d214a56d8 --- /dev/null +++ b/code/datums/greyscale/_greyscale_config.dm @@ -0,0 +1,308 @@ +#define MAX_SANE_LAYERS 50 + +/// A datum tying together a greyscale configuration and dmi file. Required for using GAGS and handles the code interactions. +/datum/greyscale_config + /// User friendly name used in the debug menu + var/name + + /// Reference to the json config file + var/json_config + + /// Reference to the dmi file for this config + var/icon_file + + /// An optional var to set that tells the material system what material this configuration is for. + /// Use a typepath here, not an instance. + var/datum/material/material_skin + + /////////////////////////////////////////////////////////////////////////////////////////// + // Do not set any further vars, the json file specified above is what generates the object + + /// Spritesheet width of the icon_file + var/width + + /// Spritesheet height of the icon_file + var/height + + /// String path to the json file, used for reloading + var/string_json_config + + /// The md5 file hash for the json configuration. Used to check if the file has changed + var/json_config_hash + + /// String path to the icon file, used for reloading + var/string_icon_file + + /// The md5 file hash for the icon file. Used to check if the file has changed + var/icon_file_hash + + /// A list of icon states and their layers + var/list/icon_states + + /// A list of all layers irrespective of nesting + var/list/flat_all_layers + + /// A list of types to update in the world whenever a config changes + var/list/live_edit_types + + /// How many colors are expected to be given when building the sprite + var/expected_colors = 0 + + /// Generated icons keyed by their color arguments + var/list/icon_cache + +// There's more sanity checking here than normal because this is designed for spriters to work with +// Sensible error messages that tell you exactly what's wrong is the best way to make this easy to use +/datum/greyscale_config/New() + if(!json_config) + stack_trace("Greyscale config object [DebugName()] is missing a json configuration, make sure `json_config` has been assigned a value.") + string_json_config = "[json_config]" + if(findtext(string_json_config, "greyscale/json_configs/") == 0) + stack_trace("All greyscale json configuration files should be located within '/greyscale/json_configs/'") + if(!icon_file) + stack_trace("Greyscale config object [DebugName()] is missing an icon file, make sure `icon_file` has been assigned a value.") + string_icon_file = "[icon_file]" + if(!name) + stack_trace("Greyscale config object [DebugName()] is missing a name, make sure `name` has been assigned a value.") + +/datum/greyscale_config/Destroy(force, ...) + if(!force) + return QDEL_HINT_LETMELIVE + return ..() + +/datum/greyscale_config/process(seconds_per_tick) + if(!Refresh(loadFromDisk=TRUE)) + return + if(!live_edit_types) + return + for(var/atom/thing in world) + if(live_edit_types[thing.type]) + thing.update_greyscale() + +/datum/greyscale_config/proc/EnableAutoRefresh(live_type) + message_admins("Config auto refresh has been enabled for '[live_type]' with configuration [DebugName()]. Expect heavy lag.") + if(live_type) + if(!live_edit_types) + live_edit_types = list() + live_edit_types += typecacheof(live_type) + START_PROCESSING(SSgreyscale, src) + +/datum/greyscale_config/proc/DisableAutoRefresh(live_type, remove_all=FALSE) + if(!remove_all && !(live_type in live_edit_types)) + return + message_admins("Config auto refresh has been disabled for '[live_type]' with configuration [DebugName()]") + if(remove_all) + live_edit_types = null + else if(live_type && live_edit_types) + live_edit_types -= typecacheof(live_type) + if(!length(live_edit_types)) + live_edit_types = null + STOP_PROCESSING(SSgreyscale, src) + +/// Call this proc to handle all the data extraction from the json configuration. Can be forced to load values from disk instead of memory. +/datum/greyscale_config/proc/Refresh(loadFromDisk=FALSE) + if(loadFromDisk) + var/changed = FALSE + + json_config = file(string_json_config) + var/json_hash = md5asfile(json_config) + if(json_config_hash != json_hash) + json_config_hash = json_hash + changed = TRUE + + icon_file = file(string_icon_file) + var/icon_hash = md5asfile(icon_file) + if(icon_file_hash != icon_hash) + icon_file_hash = icon_hash + changed = TRUE + + for(var/datum/greyscale_layer/layer as anything in flat_all_layers) + if(layer.DiskRefresh()) + changed = TRUE + + if(!changed) + return FALSE + + var/list/raw = json_decode(file2text(json_config)) + ReadIconStateConfiguration(raw) + + if(!length(icon_states)) + CRASH("The json configuration [DebugName()] doesn't have any icon states.") + + icon_cache = list() + + ReadMetadata() + + SEND_SIGNAL(src, COMSIG_GREYSCALE_CONFIG_REFRESHED) + + return TRUE + +/// Called after every config has refreshed, this proc handles data verification that depends on multiple entwined configurations. +/datum/greyscale_config/proc/CrossVerify() + for(var/icon_state in icon_states) + var/list/verification_targets = icon_states[icon_state] + verification_targets = verification_targets.Copy() + while(length(verification_targets)) + var/datum/greyscale_layer/layer = verification_targets[length(verification_targets)] + verification_targets.len-- + if(islist(layer)) + verification_targets += layer + continue + layer.CrossVerify() + +/// Gets the name used for debug purposes +/datum/greyscale_config/proc/DebugName() + var/display_name = name || "MISSING_NAME" + return "[display_name] ([icon_file]|[json_config])" + +/// Takes the json icon state configuration and puts it into a more processed format. +/datum/greyscale_config/proc/ReadIconStateConfiguration(list/data) + icon_states = list() + for(var/state in data) + var/list/raw_layers = data[state] + if(!length(raw_layers)) + stack_trace("The json configuration [DebugName()] for icon state '[state]' is missing any layers.") + continue + if(icon_states[state]) + stack_trace("The json configuration [DebugName()] has a duplicate icon state '[state]' and is being overriden.") + icon_states[state] = ReadLayersFromJson(raw_layers) + +/// Takes the json layers configuration and puts it into a more processed format +/datum/greyscale_config/proc/ReadLayersFromJson(list/data) + var/list/output = ReadLayerGroup(data) + return output[1] + +/datum/greyscale_config/proc/ReadLayerGroup(list/data) + if(!islist(data[1])) + var/layer_type = SSgreyscale.layer_types[data["type"]] + if(!layer_type) + CRASH("An unknown layer type was specified in the json of greyscale configuration [DebugName()]: [data["type"]]") + return new layer_type(icon_file, data.Copy()) // We don't want anything in there touching our version of the data + var/list/output = list() + for(var/list/group as anything in data) + output += ReadLayerGroup(group) + if(length(output)) // Adding lists to lists unwraps the top level so here we are + output = list(output) + return output + +/// Reads layer configurations to take out some useful overall information +/datum/greyscale_config/proc/ReadMetadata() + var/icon/source = icon(icon_file) + height = source.Height() + width = source.Width() + + var/list/datum/greyscale_layer/all_layers = list() + for(var/state in icon_states) + var/list/to_process = list(icon_states[state]) + var/list/state_layers = list() + + while(length(to_process)) + var/current = to_process[length(to_process)] + to_process.len-- + if(islist(current)) + to_process += current + else + state_layers += current + + all_layers += state_layers + + if(length(state_layers) > MAX_SANE_LAYERS) + stack_trace("[DebugName()] icon state '[state]' has [length(state_layers)] layers which is larger than the max of [MAX_SANE_LAYERS].") + + flat_all_layers = list() + var/list/color_groups = list() + var/largest_id = 0 + for(var/datum/greyscale_layer/layer as anything in all_layers) + flat_all_layers += layer + for(var/id in layer.color_ids) + if(!isnum(id)) + continue + largest_id = max(id, largest_id) + color_groups["[id]"] = TRUE + + for(var/i in 1 to largest_id) + if(color_groups["[i]"]) + continue + stack_trace("Color Ids are required to be sequential and start from 1. [DebugName()] has a max id of [largest_id] but is missing [i].") + + expected_colors = length(color_groups) + +/// For saving a dmi to disk, useful for debug mainly +/datum/greyscale_config/proc/SaveOutput(color_string) + var/icon/icon_output = GenerateBundle(color_string) + fcopy(icon_output, "tmp/gags_debug_output.dmi") + +/// Actually create the icon and color it in, handles caching +/datum/greyscale_config/proc/Generate(color_string, icon/last_external_icon) + var/key = color_string + var/icon/new_icon = icon_cache[key] + if(new_icon) + return icon(new_icon) + + var/icon/icon_bundle = GenerateBundle(color_string, last_external_icon=last_external_icon) + icon_bundle = fcopy_rsc(icon_bundle) + icon_cache[key] = icon_bundle + var/icon/output = icon(icon_bundle) + return output + +/// Handles the actual icon manipulation to create the spritesheet +/datum/greyscale_config/proc/GenerateBundle(list/colors, list/render_steps, icon/last_external_icon) + if(!istype(colors)) + colors = SSgreyscale.ParseColorString(colors) + if(length(colors) != expected_colors) + CRASH("[DebugName()] expected [expected_colors] color arguments but only received [length(colors)]") + + var/list/generated_icons = list() + for(var/icon_state in icon_states) + var/list/icon_state_steps + if(render_steps) + icon_state_steps = render_steps[icon_state] = list() + var/icon/generated_icon = GenerateLayerGroup(colors, icon_states[icon_state], icon_state_steps, last_external_icon) + // We read a pixel to force the icon to be fully generated before we let it loose into the world + // I hate this + generated_icon.GetPixel(1, 1) + generated_icons[icon_state] = generated_icon + + var/icon/icon_bundle = generated_icons[""] || icon('icons/testing/greyscale_error.dmi') + icon_bundle.Scale(width, height) + generated_icons -= "" + + for(var/icon_state in generated_icons) + icon_bundle.Insert(generated_icons[icon_state], icon_state) + + return icon_bundle + +/// Internal recursive proc to handle nested layer groups +/datum/greyscale_config/proc/GenerateLayerGroup(list/colors, list/group, list/render_steps, icon/last_external_icon) + var/icon/new_icon + for(var/datum/greyscale_layer/layer as anything in group) + var/icon/layer_icon + if(islist(layer)) + layer_icon = GenerateLayerGroup(colors, layer, render_steps, new_icon || last_external_icon) + layer = layer[1] // When there are multiple layers in a group like this we use the first one's blend mode + else + layer_icon = layer.Generate(colors, render_steps, new_icon || last_external_icon) + + if(!new_icon) + new_icon = layer_icon + else + new_icon.Blend(layer_icon, layer.blend_mode) + + // These are so we can see the result of every step of the process in the preview ui + if(render_steps) + var/list/icon_data = list() + render_steps += list(icon_data) + icon_data["config_name"] = name + icon_data["step"] = icon(layer_icon) + icon_data["result"] = icon(new_icon) + return new_icon + +/datum/greyscale_config/proc/GenerateDebug(colors) + var/list/output = list() + var/list/debug_steps = list() + output["steps"] = debug_steps + + output["icon"] = GenerateBundle(colors, debug_steps) + return output + +#undef MAX_SANE_LAYERS diff --git a/code/datums/greyscale/config_types/greyscale_configs.dm b/code/datums/greyscale/config_types/greyscale_configs.dm new file mode 100644 index 000000000000..cea426a3aeb3 --- /dev/null +++ b/code/datums/greyscale/config_types/greyscale_configs.dm @@ -0,0 +1,301 @@ +/datum/greyscale_config/canister + name = "Default Canister" + icon_file = 'icons/obj/atmospherics/canisters.dmi' + json_config = 'code/datums/greyscale/json_configs/canister_default.json' + +/datum/greyscale_config/canister/base + name = "Base Canister Style" + json_config = 'code/datums/greyscale/json_configs/canister_base.json' + +/datum/greyscale_config/canister/post_effects + name = "Canister Post-Effects" + json_config = 'code/datums/greyscale/json_configs/canister_post_effects.json' + +/datum/greyscale_config/canister/stripe + name = "Single Striped Canister" + json_config = 'code/datums/greyscale/json_configs/canister_stripe.json' + +/datum/greyscale_config/canister/double_stripe + name = "Double Striped Canister" + json_config = 'code/datums/greyscale/json_configs/canister_double_stripe.json' + +/datum/greyscale_config/canister/hazard + name = "Hazard Striped Canister" + json_config = 'code/datums/greyscale/json_configs/canister_hazard.json' + +/datum/greyscale_config/prototype_canister + name = "Prototype Canister" + icon_file = 'icons/obj/atmospherics/prototype_canister.dmi' + json_config = 'code/datums/greyscale/json_configs/canister_proto.json' + +/datum/greyscale_config/stationary_canister + name = "Stationary Canister" + icon_file = 'icons/obj/atmospherics/stationary_canisters.dmi' + json_config = 'code/datums/greyscale/json_configs/smooth_canister_stationary.json' + +/datum/greyscale_config/carp + name = "Space Carp" + icon_file = 'icons/mob/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp.json' + +/datum/greyscale_config/carp_magic + name = "Magicarp" + icon_file = 'icons/mob/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp_magic.json' + +/datum/greyscale_config/carp_mega + name = "Megacarp" + icon_file = 'icons/mob/broadMobs.dmi' + json_config = 'code/datums/greyscale/json_configs/carp_mega.json' + +/datum/greyscale_config/carp/disk_mouth + name = "Space Carp, Disk in Mouth" + json_config = 'code/datums/greyscale/json_configs/carp_disk_mouth.json' + +/datum/greyscale_config/wirecutters + name = "Wirecutters" + icon_file = 'icons/obj/tools.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutters.json' + +/datum/greyscale_config/wirecutters_belt_overlay + name = "Belt Worn Icon" + icon_file = 'icons/obj/clothing/belt_overlays.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutters.json' + +/datum/greyscale_config/wirecutter_inhand_left + name = "Held Wirecutter, Left" + icon_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutter_worn.json' + +/datum/greyscale_config/wirecutter_inhand_right + name = "Held Wirecutter, Right" + icon_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/wirecutter_worn.json' + +/datum/greyscale_config/screwdriver + name = "Screwdriver" + icon_file = 'icons/obj/tools.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver.json' + +/datum/greyscale_config/screwdriver_inhand_left + name = "Held Screwdriver, Left" + icon_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' + +/datum/greyscale_config/screwdriver_inhand_right + name = "Held Screwdriver, Right" + icon_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' + +/datum/greyscale_config/screwdriver_belt + name = "Belt Worn Screwdriver" + icon_file = 'icons/obj/clothing/belt_overlays.dmi' + json_config = 'code/datums/greyscale/json_configs/screwdriver_worn.json' + +/*/datum/greyscale_config/gloves_inhand_left + name = "Held Gloves, Left" + icon_file = 'icons/mob/inhands/clothing/gloves_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/gloves_inhand.json' + +/datum/greyscale_config/gloves_inhand_right + name = "Held Gloves, Right" + icon_file = 'icons/mob/inhands/clothing/gloves_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/gloves_inhand.json'*/ + +/datum/greyscale_config/jumpsuit + name = "Jumpsuit" + icon_file = 'icons/obj/clothing/under/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit.json' + +/datum/greyscale_config/jumpsuit_worn + name = "Worn Jumpsuit" + icon_file = 'icons/mob/clothing/uniform/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_worn.json' + +/datum/greyscale_config/jumpsuit_lizard_worn + name = "Worn Jumpsuit" + icon_file = 'icons/mob/clothing/uniform/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_worn.json' + +/datum/greyscale_config/jumpsuit_inhand_left + name = "Held Jumpsuit, Left" + icon_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_inhand.json' + +/datum/greyscale_config/jumpsuit_inhand_right + name = "Held Jumpsuit, Right" + icon_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_inhand.json' + +/datum/greyscale_config/jumpsuit_prison + name = "Prison Jumpsuit" + icon_file = 'icons/obj/clothing/under/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison.json' + +/datum/greyscale_config/jumpsuit_prison_worn + name = "Worn Prison Jumpsuit" + icon_file = 'icons/mob/clothing/uniform/color.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_worn.json' + +/datum/greyscale_config/jumpsuit_prison_inhand_left + name = "Held Prison Jumpsuit, Left" + icon_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json' + +/datum/greyscale_config/jumpsuit_prison_inhand_right + name = "Held Prison Jumpsuit, Right" + icon_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json' + +/datum/greyscale_config/tablet + name = "PDA" + icon_file = 'icons/obj/modular_pda.dmi' + json_config = 'code/datums/greyscale/json_configs/pda.json' + +/datum/greyscale_config/tablet/chaplain + name = "Chaplain PDA" + json_config = 'code/datums/greyscale/json_configs/pda_chaplain.json' + +/datum/greyscale_config/tablet/captain + name = "Captain PDA" + json_config = 'code/datums/greyscale/json_configs/pda_captain.json' + +/datum/greyscale_config/tablet/clown + name = "Clown PDA" + json_config = 'code/datums/greyscale/json_configs/pda_clown.json' + +/datum/greyscale_config/tablet/head + name = "Head PDA" + json_config = 'code/datums/greyscale/json_configs/pda_head.json' + +/datum/greyscale_config/tablet/mime + name = "Mime PDA" + json_config = 'code/datums/greyscale/json_configs/pda_mime.json' + +/datum/greyscale_config/tablet/stripe_split + name = "Split Stripe PDA" + json_config = 'code/datums/greyscale/json_configs/pda_stripe_split.json' + +/datum/greyscale_config/tablet/stripe_thick + name = "Thick Stripe PDA" + json_config = 'code/datums/greyscale/json_configs/pda_stripe_thick.json' + +/datum/greyscale_config/tablet/stripe_thick/head + name = "Head Thick Stripe PDA" + json_config = 'code/datums/greyscale/json_configs/pda_stripe_thick_head.json' + +/datum/greyscale_config/sneakers + name = "Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers.json' + +/datum/greyscale_config/sneakers_worn + name = "Worn Sneakers" + icon_file = 'icons/mob/clothing/feet/feet.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_worn.json' + +/datum/greyscale_config/sneakers_inhand_left + name = "Held Sneakers, Left" + icon_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_inhand.json' + +/datum/greyscale_config/sneakers_inhand_right + name = "Held Sneakers, Right" + icon_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_inhand.json' + +/datum/greyscale_config/sneakers_orange + name = "Orange Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_orange.json' + +/datum/greyscale_config/sneakers_orange_worn + name = "Worn Orange Sneakers" + icon_file = 'icons/mob/clothing/feet/feet.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_orange_worn.json' + +/datum/greyscale_config/sneakers_orange_inhand_left + name = "Held Orange Sneakers, Left" + icon_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_orange_inhand.json' + +/datum/greyscale_config/sneakers_orange_inhand_right + name = "Held Orange Sneakers, Right" + icon_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_orange_inhand.json' + +/datum/greyscale_config/sneakers_wheelys + name = "Wheeled Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_wheelys.json' + +/datum/greyscale_config/sneakers_marisa + name = "Marisa Sneakers" + icon_file = 'icons/obj/clothing/shoes.dmi' + json_config = 'code/datums/greyscale/json_configs/sneakers_marisa.json' + +/datum/greyscale_config/sneakers_marisa/worn + name = "Worn Marisa Sneakers" + icon_file = 'icons/mob/clothing/feet/feet.dmi' + +/datum/greyscale_config/circuit + name = "Circuit Board" + icon_file = 'icons/obj/module.dmi' + json_config = 'code/datums/greyscale/json_configs/circuit.json' + +/datum/greyscale_config/sombrero + name = "Sombrero" + icon_file = 'icons/obj/clothing/sombrero.dmi' + json_config = 'code/datums/greyscale/json_configs/sombrero.json' + +/datum/greyscale_config/sombrero/base + name = "Base Sombrero Style" + json_config = 'code/datums/greyscale/json_configs/sombrero_base.json' + +/datum/greyscale_config/sombrero/lefthand + name = "Held Sombrero, Left" + json_config = 'code/datums/greyscale/json_configs/sombrero_lefthand.json' + +/datum/greyscale_config/sombrero/base_lefthand + name = "Base Held Sombrero Style, Left" + json_config = 'code/datums/greyscale/json_configs/sombrero_base_lefthand.json' + +/datum/greyscale_config/sombrero/righthand + name = "Held Sombrero, Right" + json_config = 'code/datums/greyscale/json_configs/sombrero_righthand.json' + +/datum/greyscale_config/sombrero/base_righthand + name = "Base Held Sombrero Style, Right" + json_config = 'code/datums/greyscale/json_configs/sombrero_base_righthand.json' + +/datum/greyscale_config/sombrero/worn + name = "Worn Sombrero" + json_config = 'code/datums/greyscale/json_configs/sombrero_worn.json' + +/datum/greyscale_config/sombrero/base_worn + name = "Base Worn Sombrero Style" + json_config = 'code/datums/greyscale/json_configs/sombrero_base_worn.json' + +/* + TBD + +/datum/greyscale_config/winter_coats + name = "Winter Coat" + icon_file = 'icons/obj/clothing/suits/wintercoat.dmi' + json_config = 'code/datums/greyscale/json_configs/wintercoats.json' + +/datum/greyscale_config/winter_coats/worn + name = "Winter Coat Worn" + icon_file = 'icons/mob/clothing/suits/wintercoat.dmi' + json_config = 'code/datums/greyscale/json_configs/wintercoats_worn.json' + +/datum/greyscale_config/winter_hoods + name = "Winter Coat Hood" + icon_file = 'icons/obj/clothing/head/winterhood.dmi' + json_config = 'code/datums/greyscale/json_configs/wintercoats_hood.json' + +/datum/greyscale_config/winter_hoods/worn + name = "Winter Coat Hood Worn" + icon_file = 'icons/mob/clothing/head/winterhood.dmi' + json_config = 'code/datums/greyscale/json_configs/wintercoats_hood_worn.json' +*/ diff --git a/code/datums/greyscale/config_types/material_effects.dm b/code/datums/greyscale/config_types/material_effects.dm new file mode 100644 index 000000000000..fec8b2da8879 --- /dev/null +++ b/code/datums/greyscale/config_types/material_effects.dm @@ -0,0 +1,4 @@ +/*/datum/greyscale_config/shimmer + name = "Shimmer Effect" + icon_file = 'icons/effects/shimmer.dmi' + json_config = 'code/datums/greyscale/json_configs/material_effects/shimmer.json'*/ diff --git a/code/datums/greyscale/config_types/mutant_organ_config.dm b/code/datums/greyscale/config_types/mutant_organ_config.dm new file mode 100644 index 000000000000..a4df62e5b99b --- /dev/null +++ b/code/datums/greyscale/config_types/mutant_organ_config.dm @@ -0,0 +1,5 @@ +/*/datum/greyscale_config/mutant_organ + name = "Mutant Organ" + icon_file = 'icons/obj/medical/organs/infuser_organs.dmi' + json_config = 'code/datums/greyscale/json_configs/mutant_organs.json' +*/ diff --git a/code/datums/greyscale/json_configs/canister_base.json b/code/datums/greyscale/json_configs/canister_base.json new file mode 100644 index 000000000000..4528c6225c63 --- /dev/null +++ b/code/datums/greyscale/json_configs/canister_base.json @@ -0,0 +1,20 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "add_shader", + "blend_mode": "add" + }, + { + "type": "icon_state", + "icon_state": "multi_shader", + "blend_mode": "multiply" + } + ] +} diff --git a/code/datums/greyscale/json_configs/canister_default.json b/code/datums/greyscale/json_configs/canister_default.json new file mode 100644 index 000000000000..b965e9ec3fd1 --- /dev/null +++ b/code/datums/greyscale/json_configs/canister_default.json @@ -0,0 +1,24 @@ +{ + "": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/post_effects", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/canister_double_stripe.json b/code/datums/greyscale/json_configs/canister_double_stripe.json new file mode 100644 index 000000000000..33dd115d3ea7 --- /dev/null +++ b/code/datums/greyscale/json_configs/canister_double_stripe.json @@ -0,0 +1,37 @@ +{ + "": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + [ + { + "type": "icon_state", + "icon_state": "double_stripe", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "double_stripe_shader", + "blend_mode": "subtract" + } + ], + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/post_effects", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/canister_hazard.json b/code/datums/greyscale/json_configs/canister_hazard.json new file mode 100644 index 000000000000..81c193622312 --- /dev/null +++ b/code/datums/greyscale/json_configs/canister_hazard.json @@ -0,0 +1,30 @@ +{ + "": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "hazard_stripes", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/post_effects", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/canister_post_effects.json b/code/datums/greyscale/json_configs/canister_post_effects.json new file mode 100644 index 000000000000..6756c3221f9c --- /dev/null +++ b/code/datums/greyscale/json_configs/canister_post_effects.json @@ -0,0 +1,15 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "outline", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "lights", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/canister_proto.json b/code/datums/greyscale/json_configs/canister_proto.json new file mode 100644 index 000000000000..09f19b80e9b4 --- /dev/null +++ b/code/datums/greyscale/json_configs/canister_proto.json @@ -0,0 +1,39 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "can_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "can_shader", + "blend_mode": "multiply" + }, + { + "type": "icon_state", + "icon_state": "stand", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "decals", + "blend_mode": "overlay" + }, + [ + { + "type": "icon_state", + "icon_state": "light_base", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "light", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] + ] +} diff --git a/code/datums/greyscale/json_configs/canister_stripe.json b/code/datums/greyscale/json_configs/canister_stripe.json new file mode 100644 index 000000000000..9e5f087c0aef --- /dev/null +++ b/code/datums/greyscale/json_configs/canister_stripe.json @@ -0,0 +1,30 @@ +{ + "": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "stripe", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "reference", + "reference_type": "/datum/greyscale_config/canister/post_effects", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "window-base": [ + { + "type": "icon_state", + "icon_state": "window-base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/carp.json b/code/datums/greyscale/json_configs/carp.json new file mode 100644 index 000000000000..d01fda5a9eef --- /dev/null +++ b/code/datums/greyscale/json_configs/carp.json @@ -0,0 +1,28 @@ +{ + "base": [ + { + "type": "icon_state", + "icon_state": "base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "base_mouth", + "blend_mode": "overlay" + } + ], + "base_dead": [ + { + "type": "icon_state", + "icon_state": "base_dead", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "base_dead_mouth", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/carp_disk_mouth.json b/code/datums/greyscale/json_configs/carp_disk_mouth.json new file mode 100644 index 000000000000..f74fcfdeec65 --- /dev/null +++ b/code/datums/greyscale/json_configs/carp_disk_mouth.json @@ -0,0 +1,10 @@ +{ + "disk_mouth": [ + { + "type": "icon_state", + "icon_state": "disk_mouth", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/carp_magic.json b/code/datums/greyscale/json_configs/carp_magic.json new file mode 100644 index 000000000000..947ea225b5f2 --- /dev/null +++ b/code/datums/greyscale/json_configs/carp_magic.json @@ -0,0 +1,33 @@ +{ + "base": [ + { + "type": "icon_state", + "icon_state": "base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "magic_eyes", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "base_mouth", + "blend_mode": "overlay" + } + ], + "base_dead": [ + { + "type": "icon_state", + "icon_state": "base_dead", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "base_dead_mouth", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/carp_mega.json b/code/datums/greyscale/json_configs/carp_mega.json new file mode 100644 index 000000000000..9b15cbf1c4b6 --- /dev/null +++ b/code/datums/greyscale/json_configs/carp_mega.json @@ -0,0 +1,28 @@ +{ + "megacarp_greyscale": [ + { + "type": "icon_state", + "icon_state": "megacarp_greyscale", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "megacarp_face", + "blend_mode": "overlay" + } + ], + "megacarp_dead_greyscale": [ + { + "type": "icon_state", + "icon_state": "megacarp_dead_greyscale", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "megacarp_dead_tongue", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/circuit.json b/code/datums/greyscale/json_configs/circuit.json new file mode 100644 index 000000000000..ed1569cda253 --- /dev/null +++ b/code/datums/greyscale/json_configs/circuit.json @@ -0,0 +1,15 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "circuit_board", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "circuit_chip", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/gloves_inhand.json b/code/datums/greyscale/json_configs/gloves_inhand.json new file mode 100644 index 000000000000..7b1bb5100f49 --- /dev/null +++ b/code/datums/greyscale/json_configs/gloves_inhand.json @@ -0,0 +1,10 @@ +{ + "greyscale_gloves": [ + { + "type": "icon_state", + "icon_state": "greyscale_gloves", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/ceremonial_blade.json b/code/datums/greyscale/json_configs/items/ceremonial_blade.json new file mode 100644 index 000000000000..16360a5e8894 --- /dev/null +++ b/code/datums/greyscale/json_configs/items/ceremonial_blade.json @@ -0,0 +1,15 @@ +{ + "default": [ + { + "type": "icon_state", + "icon_state": "base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "handle", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/ceremonial_blade_lefthand.json b/code/datums/greyscale/json_configs/items/ceremonial_blade_lefthand.json new file mode 100644 index 000000000000..aafdb2d897ed --- /dev/null +++ b/code/datums/greyscale/json_configs/items/ceremonial_blade_lefthand.json @@ -0,0 +1,10 @@ +{ + "default": [ + { + "type": "icon_state", + "icon_state": "inhand_left", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/ceremonial_blade_righthand.json b/code/datums/greyscale/json_configs/items/ceremonial_blade_righthand.json new file mode 100644 index 000000000000..d80b0c49a25a --- /dev/null +++ b/code/datums/greyscale/json_configs/items/ceremonial_blade_righthand.json @@ -0,0 +1,10 @@ +{ + "default": [ + { + "type": "icon_state", + "icon_state": "inhand_right", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace.json b/code/datums/greyscale/json_configs/items/cleric_mace.json new file mode 100644 index 000000000000..781c790ea6ab --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace.json @@ -0,0 +1,28 @@ +{ + "default": [ + { + "type": "icon_state", + "icon_state": "base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "handle", + "blend_mode": "overlay" + } + ], + "default_worn": [ + { + "type": "icon_state", + "icon_state": "worn_shaft", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "worn_handle", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace_gold.json b/code/datums/greyscale/json_configs/items/cleric_mace_gold.json new file mode 100644 index 000000000000..8ca0ba3b607a --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace_gold.json @@ -0,0 +1,46 @@ +{ + "default": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/cleric_mace", + "icon_state": "default", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/shimmer", + "blend_mode": "overlay", + "color_ids": [ "#ffffff" ] + }, + { + "type": "icon_state", + "icon_state": "shimmer_mask", + "blend_mode": "multiply" + } + ] + ], + "default_worn": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/cleric_mace", + "icon_state": "default_worn", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/shimmer", + "blend_mode": "overlay", + "color_ids": [ "#ffffff" ] + }, + { + "type": "icon_state", + "icon_state": "shimmer_mask_worn", + "blend_mode": "multiply" + } + ] + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace_lefthand.json b/code/datums/greyscale/json_configs/items/cleric_mace_lefthand.json new file mode 100644 index 000000000000..aafdb2d897ed --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace_lefthand.json @@ -0,0 +1,10 @@ +{ + "default": [ + { + "type": "icon_state", + "icon_state": "inhand_left", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace_lefthand_gold.json b/code/datums/greyscale/json_configs/items/cleric_mace_lefthand_gold.json new file mode 100644 index 000000000000..9372b4b05516 --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace_lefthand_gold.json @@ -0,0 +1,24 @@ +{ + "default": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/cleric_mace_lefthand", + "icon_state": "default", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/shimmer", + "blend_mode": "overlay", + "color_ids": [ "#ffffff" ] + }, + { + "type": "icon_state", + "icon_state": "shimmer_mask_lefthand", + "blend_mode": "multiply" + } + ] + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace_righthand.json b/code/datums/greyscale/json_configs/items/cleric_mace_righthand.json new file mode 100644 index 000000000000..d80b0c49a25a --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace_righthand.json @@ -0,0 +1,10 @@ +{ + "default": [ + { + "type": "icon_state", + "icon_state": "inhand_right", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace_righthand_gold.json b/code/datums/greyscale/json_configs/items/cleric_mace_righthand_gold.json new file mode 100644 index 000000000000..d91f1c0800c7 --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace_righthand_gold.json @@ -0,0 +1,24 @@ +{ + "default": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/cleric_mace_righthand", + "icon_state": "default", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/shimmer", + "blend_mode": "overlay", + "color_ids": [ "#ffffff" ] + }, + { + "type": "icon_state", + "icon_state": "shimmer_mask_righthand", + "blend_mode": "multiply" + } + ] + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace_worn.json b/code/datums/greyscale/json_configs/items/cleric_mace_worn.json new file mode 100644 index 000000000000..c49a829aa2c2 --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace_worn.json @@ -0,0 +1,15 @@ +{ + "default": [ + { + "type": "icon_state", + "icon_state": "worn_shaft", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "worn_handle", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/items/cleric_mace_worn_gold.json b/code/datums/greyscale/json_configs/items/cleric_mace_worn_gold.json new file mode 100644 index 000000000000..21850436657c --- /dev/null +++ b/code/datums/greyscale/json_configs/items/cleric_mace_worn_gold.json @@ -0,0 +1,24 @@ +{ + "default": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/cleric_mace_worn", + "icon_state": "default", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/shimmer", + "blend_mode": "overlay", + "color_ids": [ "#ffffff" ] + }, + { + "type": "icon_state", + "icon_state": "shimmer_mask_worn", + "blend_mode": "multiply" + } + ] + ] +} diff --git a/code/datums/greyscale/json_configs/jumpsuit.json b/code/datums/greyscale/json_configs/jumpsuit.json new file mode 100644 index 000000000000..03044770b956 --- /dev/null +++ b/code/datums/greyscale/json_configs/jumpsuit.json @@ -0,0 +1,28 @@ +{ + "jumpsuit": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_accessories", + "blend_mode": "overlay" + } + ], + "jumpskirt": [ + { + "type": "icon_state", + "icon_state": "jumpskirt", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_accessories", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jumpsuit_inhand.json b/code/datums/greyscale/json_configs/jumpsuit_inhand.json new file mode 100644 index 000000000000..754620651b9a --- /dev/null +++ b/code/datums/greyscale/json_configs/jumpsuit_inhand.json @@ -0,0 +1,15 @@ +{ + "jumpsuit": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_accessories", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jumpsuit_prison.json b/code/datums/greyscale/json_configs/jumpsuit_prison.json new file mode 100644 index 000000000000..1ac85b764bff --- /dev/null +++ b/code/datums/greyscale/json_configs/jumpsuit_prison.json @@ -0,0 +1,28 @@ +{ + "jumpsuit": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_prison", + "blend_mode": "overlay" + } + ], + "jumpskirt": [ + { + "type": "icon_state", + "icon_state": "jumpskirt", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_prison", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json b/code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json new file mode 100644 index 000000000000..be537b5a00a9 --- /dev/null +++ b/code/datums/greyscale/json_configs/jumpsuit_prison_inhand.json @@ -0,0 +1,15 @@ +{ + "jumpsuit": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_prison", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jumpsuit_prison_worn.json b/code/datums/greyscale/json_configs/jumpsuit_prison_worn.json new file mode 100644 index 000000000000..0096c95e812a --- /dev/null +++ b/code/datums/greyscale/json_configs/jumpsuit_prison_worn.json @@ -0,0 +1,54 @@ +{ + "jumpsuit": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_prison", + "blend_mode": "overlay" + } + ], + "jumpsuit_d" : [ + { + "type": "icon_state", + "icon_state": "jumpsuit_d", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_d_prison", + "blend_mode": "overlay" + } + ], + "jumpskirt": [ + { + "type": "icon_state", + "icon_state": "jumpskirt", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpskirt_prison", + "blend_mode": "overlay" + } + ], + "jumpskirt_d" : [ + { + "type": "icon_state", + "icon_state": "jumpskirt_d", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpskirt_d_prison", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/jumpsuit_worn.json b/code/datums/greyscale/json_configs/jumpsuit_worn.json new file mode 100644 index 000000000000..99bc3fc19874 --- /dev/null +++ b/code/datums/greyscale/json_configs/jumpsuit_worn.json @@ -0,0 +1,65 @@ +{ + "jumpsuit": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_accessories", + "blend_mode": "overlay" + } + ], + "jumpsuit_d" : [ + { + "type": "icon_state", + "icon_state": "jumpsuit_d", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "jumpsuit_l": [ + { + "type": "icon_state", + "icon_state": "jumpsuit_l", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_accessories", + "blend_mode": "overlay" + } + ], + "jumpsuit_d_l" : [ + { + "type": "icon_state", + "icon_state": "jumpsuit_d_l", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "jumpskirt": [ + { + "type": "icon_state", + "icon_state": "jumpskirt", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpskirt_accessories", + "blend_mode": "overlay" + } + ], + "jumpskirt_d" : [ + { + "type": "icon_state", + "icon_state": "jumpskirt_d", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/material_effects/shimmer.json b/code/datums/greyscale/json_configs/material_effects/shimmer.json new file mode 100644 index 000000000000..64e2168e5c2e --- /dev/null +++ b/code/datums/greyscale/json_configs/material_effects/shimmer.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "animation", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda.json b/code/datums/greyscale/json_configs/pda.json new file mode 100644 index 000000000000..c10b453817ae --- /dev/null +++ b/code/datums/greyscale/json_configs/pda.json @@ -0,0 +1,21 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_captain.json b/code/datums/greyscale/json_configs/pda_captain.json new file mode 100644 index 000000000000..52d3f9d1333d --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_captain.json @@ -0,0 +1,33 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_split", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_thick", + "blend_mode": "overlay", + "color_ids": [ 4 ] + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_chaplain.json b/code/datums/greyscale/json_configs/pda_chaplain.json new file mode 100644 index 000000000000..e4e351e339df --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_chaplain.json @@ -0,0 +1,26 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_cross", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_clown.json b/code/datums/greyscale/json_configs/pda_clown.json new file mode 100644 index 000000000000..e9be89223693 --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_clown.json @@ -0,0 +1,9 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda-clown", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_head.json b/code/datums/greyscale/json_configs/pda_head.json new file mode 100644 index 000000000000..c9f56870373a --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_head.json @@ -0,0 +1,26 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_head", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_mime.json b/code/datums/greyscale/json_configs/pda_mime.json new file mode 100644 index 000000000000..dc76e60649b3 --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_mime.json @@ -0,0 +1,26 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_mime", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_stripe_split.json b/code/datums/greyscale/json_configs/pda_stripe_split.json new file mode 100644 index 000000000000..82aaaac10316 --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_stripe_split.json @@ -0,0 +1,27 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_split", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_stripe_thick.json b/code/datums/greyscale/json_configs/pda_stripe_thick.json new file mode 100644 index 000000000000..cc730f3816a1 --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_stripe_thick.json @@ -0,0 +1,27 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_thick", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/pda_stripe_thick_head.json b/code/datums/greyscale/json_configs/pda_stripe_thick_head.json new file mode 100644 index 000000000000..ea216b2476bd --- /dev/null +++ b/code/datums/greyscale/json_configs/pda_stripe_thick_head.json @@ -0,0 +1,32 @@ +{ + "pda": [ + { + "type": "icon_state", + "icon_state": "pda_base", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "pda_buttons", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_thick", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "pda_stripe_head", + "blend_mode": "overlay" + }, + { + "type": "icon_state", + "icon_state": "pda_screen_borders", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/screwdriver.json b/code/datums/greyscale/json_configs/screwdriver.json new file mode 100644 index 000000000000..7604eb074659 --- /dev/null +++ b/code/datums/greyscale/json_configs/screwdriver.json @@ -0,0 +1,15 @@ +{ + "screwdriver_map": [ + { + "type": "icon_state", + "icon_state": "screwdriver", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "screwdriver_screwybits", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/screwdriver_worn.json b/code/datums/greyscale/json_configs/screwdriver_worn.json new file mode 100644 index 000000000000..9e63bb6b8837 --- /dev/null +++ b/code/datums/greyscale/json_configs/screwdriver_worn.json @@ -0,0 +1,15 @@ +{ + "screwdriver": [ + { + "type": "icon_state", + "icon_state": "screwdriver", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "screwdriver_head", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/smooth_canister_stationary.json b/code/datums/greyscale/json_configs/smooth_canister_stationary.json new file mode 100644 index 000000000000..df01ce1e6d25 --- /dev/null +++ b/code/datums/greyscale/json_configs/smooth_canister_stationary.json @@ -0,0 +1,186 @@ +{ + "smooth": [ + { + "type": "icon_state", + "icon_state": "smooth", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "window-fg": [ + { + "type": "icon_state", + "icon_state": "window-fg", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "window-bg": [ + { + "type": "icon_state", + "icon_state": "window-bg", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "1-i": [ + { + "type": "icon_state", + "icon_state": "1-i", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "2-i": [ + { + "type": "icon_state", + "icon_state": "2-i", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "3-i": [ + { + "type": "icon_state", + "icon_state": "3-i", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "4-i": [ + { + "type": "icon_state", + "icon_state": "4-i", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "1-n": [ + { + "type": "icon_state", + "icon_state": "1-n", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "2-n": [ + { + "type": "icon_state", + "icon_state": "2-n", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "3-s": [ + { + "type": "icon_state", + "icon_state": "3-s", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "4-s": [ + { + "type": "icon_state", + "icon_state": "4-s", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "1-w": [ + { + "type": "icon_state", + "icon_state": "1-w", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "2-e": [ + { + "type": "icon_state", + "icon_state": "2-e", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "3-w": [ + { + "type": "icon_state", + "icon_state": "3-w", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "4-e": [ + { + "type": "icon_state", + "icon_state": "4-e", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "1-nw": [ + { + "type": "icon_state", + "icon_state": "1-nw", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "2-ne": [ + { + "type": "icon_state", + "icon_state": "2-ne", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "3-sw": [ + { + "type": "icon_state", + "icon_state": "3-sw", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "4-se": [ + { + "type": "icon_state", + "icon_state": "4-se", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "1-f": [ + { + "type": "icon_state", + "icon_state": "1-f", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "2-f": [ + { + "type": "icon_state", + "icon_state": "2-f", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "3-f": [ + { + "type": "icon_state", + "icon_state": "3-f", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "4-f": [ + { + "type": "icon_state", + "icon_state": "4-f", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers.json b/code/datums/greyscale/json_configs/sneakers.json new file mode 100644 index 000000000000..50a064bb02b6 --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers.json @@ -0,0 +1,16 @@ +{ + "sneakers": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers_inhand.json b/code/datums/greyscale/json_configs/sneakers_inhand.json new file mode 100644 index 000000000000..f6d712ff181f --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers_inhand.json @@ -0,0 +1,16 @@ +{ + "sneakers_back": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers_marisa.json b/code/datums/greyscale/json_configs/sneakers_marisa.json new file mode 100644 index 000000000000..b42838b3e152 --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers_marisa.json @@ -0,0 +1,21 @@ +{ + "sneakers": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_marisa", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers_orange.json b/code/datums/greyscale/json_configs/sneakers_orange.json new file mode 100644 index 000000000000..fb0a07ff1969 --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers_orange.json @@ -0,0 +1,35 @@ +{ + "sneakers": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "sneakers_chained": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_chained", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers_orange_inhand.json b/code/datums/greyscale/json_configs/sneakers_orange_inhand.json new file mode 100644 index 000000000000..de2cae90e031 --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers_orange_inhand.json @@ -0,0 +1,35 @@ +{ + "sneakers_back": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "sneakers_chained": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_chained", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers_orange_worn.json b/code/datums/greyscale/json_configs/sneakers_orange_worn.json new file mode 100644 index 000000000000..fb0a07ff1969 --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers_orange_worn.json @@ -0,0 +1,35 @@ +{ + "sneakers": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ], + "sneakers_chained": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_chained", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers_wheelys.json b/code/datums/greyscale/json_configs/sneakers_wheelys.json new file mode 100644 index 000000000000..221dd5717fe1 --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers_wheelys.json @@ -0,0 +1,21 @@ +{ + "sneakers": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_wheelys", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sneakers_worn.json b/code/datums/greyscale/json_configs/sneakers_worn.json new file mode 100644 index 000000000000..50a064bb02b6 --- /dev/null +++ b/code/datums/greyscale/json_configs/sneakers_worn.json @@ -0,0 +1,16 @@ +{ + "sneakers": [ + { + "type": "icon_state", + "icon_state": "sneakers_back", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sneakers_front", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero.json b/code/datums/greyscale/json_configs/sombrero.json new file mode 100644 index 000000000000..8a183c55defb --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero.json @@ -0,0 +1,23 @@ +{ + "sombrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + } + ], + "shamebrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + }, + { + "type": "icon_state", + "icon_state": "dongles", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero_base.json b/code/datums/greyscale/json_configs/sombrero_base.json new file mode 100644 index 000000000000..9f2097ac2e86 --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero_base.json @@ -0,0 +1,21 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "cloth", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ornamentation", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "plate", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero_base_lefthand.json b/code/datums/greyscale/json_configs/sombrero_base_lefthand.json new file mode 100644 index 000000000000..d9d26e0b9c25 --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero_base_lefthand.json @@ -0,0 +1,16 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "cloth_lefthand", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ornamentation_lefthand", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero_base_righthand.json b/code/datums/greyscale/json_configs/sombrero_base_righthand.json new file mode 100644 index 000000000000..32769cb21be3 --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero_base_righthand.json @@ -0,0 +1,16 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "cloth_righthand", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ornamentation_righthand", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero_base_worn.json b/code/datums/greyscale/json_configs/sombrero_base_worn.json new file mode 100644 index 000000000000..e97c1875df41 --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero_base_worn.json @@ -0,0 +1,21 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "cloth_worn", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "ornamentation_worn", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "plate_worn", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero_lefthand.json b/code/datums/greyscale/json_configs/sombrero_lefthand.json new file mode 100644 index 000000000000..5ba8a89ed28c --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero_lefthand.json @@ -0,0 +1,23 @@ +{ + "sombrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base_lefthand", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + } + ], + "shamebrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base_lefthand", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + }, + { + "type": "icon_state", + "icon_state": "dongles_lefthand", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero_righthand.json b/code/datums/greyscale/json_configs/sombrero_righthand.json new file mode 100644 index 000000000000..07737ad2532b --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero_righthand.json @@ -0,0 +1,23 @@ +{ + "sombrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base_righthand", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + } + ], + "shamebrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base_righthand", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + }, + { + "type": "icon_state", + "icon_state": "dongles_righthand", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/sombrero_worn.json b/code/datums/greyscale/json_configs/sombrero_worn.json new file mode 100644 index 000000000000..a70cd5ce9c70 --- /dev/null +++ b/code/datums/greyscale/json_configs/sombrero_worn.json @@ -0,0 +1,23 @@ +{ + "sombrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base_worn", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + } + ], + "shamebrero": [ + { + "type": "reference", + "reference_type": "/datum/greyscale_config/sombrero/base_worn", + "blend_mode": "overlay", + "color_ids": [ 1, 2 ] + }, + { + "type": "icon_state", + "icon_state": "dongles_worn", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/wintercoats.json b/code/datums/greyscale/json_configs/wintercoats.json new file mode 100644 index 000000000000..a1a50b044479 --- /dev/null +++ b/code/datums/greyscale/json_configs/wintercoats.json @@ -0,0 +1,84 @@ +{ + "coatwinter": [ + { + "type": "icon_state", + "icon_state": "neck", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sleeves", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "arms", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "bodytop", + "blend_mode": "overlay", + "color_ids": [ 4 ] + }, + { + "type": "icon_state", + "icon_state": "bodymiddle", + "blend_mode": "overlay", + "color_ids": [ 5 ] + }, + { + "type": "icon_state", + "icon_state": "bodybottom", + "blend_mode": "overlay", + "color_ids": [ 6 ] + } + ], + "coatwinter_t": [ + { + "type": "icon_state", + "icon_state": "neck", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sleeves", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "arms", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "bodytop", + "blend_mode": "overlay", + "color_ids": [ 4 ] + }, + { + "type": "icon_state", + "icon_state": "bodymiddle", + "blend_mode": "overlay", + "color_ids": [ 5 ] + }, + { + "type": "icon_state", + "icon_state": "bodybottom", + "blend_mode": "overlay", + "color_ids": [ 6 ] + }, + { + "type": "icon_state", + "icon_state": "hood", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/wintercoats_hood.json b/code/datums/greyscale/json_configs/wintercoats_hood.json new file mode 100644 index 000000000000..d4ea34aa73a9 --- /dev/null +++ b/code/datums/greyscale/json_configs/wintercoats_hood.json @@ -0,0 +1,22 @@ +{ + "hood_winter": [ + { + "type": "icon_state", + "icon_state": "top_trim", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "bottom_trim", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "hood_cloth", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/wintercoats_hood_worn.json b/code/datums/greyscale/json_configs/wintercoats_hood_worn.json new file mode 100644 index 000000000000..d4ea34aa73a9 --- /dev/null +++ b/code/datums/greyscale/json_configs/wintercoats_hood_worn.json @@ -0,0 +1,22 @@ +{ + "hood_winter": [ + { + "type": "icon_state", + "icon_state": "top_trim", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "bottom_trim", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "hood_cloth", + "blend_mode": "overlay", + "color_ids": [ 3 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/wintercoats_worn.json b/code/datums/greyscale/json_configs/wintercoats_worn.json new file mode 100644 index 000000000000..59e2e9223b16 --- /dev/null +++ b/code/datums/greyscale/json_configs/wintercoats_worn.json @@ -0,0 +1,79 @@ +{ + "coatwinter": [ + { + "type": "icon_state", + "icon_state": "neck_worn", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sleeves_worn", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "arms_worn", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "bodytop_worn", + "blend_mode": "overlay", + "color_ids": [ 4 ] + }, + { + "type": "icon_state", + "icon_state": "bodymiddle_worn", + "blend_mode": "overlay", + "color_ids": [ 5 ] + }, + { + "type": "icon_state", + "icon_state": "bodybottom_worn", + "blend_mode": "overlay", + "color_ids": [ 6 ] + } + ], + + "coatwinter_t": [ + { + "type": "icon_state", + "icon_state": "neck_worn", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "sleeves_worn", + "blend_mode": "overlay", + "color_ids": [ 2 ] + }, + { + "type": "icon_state", + "icon_state": "arms_worn", + "blend_mode": "overlay", + "color_ids": [ 3 ] + }, + { + "type": "icon_state", + "icon_state": "bodytop_worn_t", + "blend_mode": "overlay", + "color_ids": [ 4 ] + }, + { + "type": "icon_state", + "icon_state": "bodymiddle_worn_t", + "blend_mode": "overlay", + "color_ids": [ 5 ] + }, + { + "type": "icon_state", + "icon_state": "bodybottom_worn_t", + "blend_mode": "overlay", + "color_ids": [ 6 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/wirecutter_worn.json b/code/datums/greyscale/json_configs/wirecutter_worn.json new file mode 100644 index 000000000000..a5158a3b3892 --- /dev/null +++ b/code/datums/greyscale/json_configs/wirecutter_worn.json @@ -0,0 +1,15 @@ +{ + "cutters": [ + { + "type": "icon_state", + "icon_state": "cutters", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "cutters_cutty_thingy", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/wirecutters.json b/code/datums/greyscale/json_configs/wirecutters.json new file mode 100644 index 000000000000..0fb5c530eb53 --- /dev/null +++ b/code/datums/greyscale/json_configs/wirecutters.json @@ -0,0 +1,15 @@ +{ + "cutters_map": [ + { + "type": "icon_state", + "icon_state": "cutters", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "cutters_cutty_thingy", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_reader.dm b/code/datums/greyscale/json_reader.dm new file mode 100644 index 000000000000..ffe143c28fc7 --- /dev/null +++ b/code/datums/greyscale/json_reader.dm @@ -0,0 +1,75 @@ +/// Takes a json list and extracts a single value. +/// Subtypes represent different conversions of that value. +/datum/json_reader + +/// Takes a value read directly from json and verifies/converts as needed to a result +/datum/json_reader/proc/ReadJson(value) + return + +/datum/json_reader/text/ReadJson(value) + if(!istext(value)) + CRASH("Text value expected but got '[value]'") + return value + +/datum/json_reader/number/ReadJson(value) + var/newvalue = text2num(value) + if(!isnum(newvalue)) + CRASH("Number expected but got [newvalue]") + return newvalue + +/datum/json_reader/number_color_list/ReadJson(list/value) + if(!istype(value)) + CRASH("Expected a list but got [value]") + var/list/new_values = list() + for(var/number_string in value) + var/new_value = text2num(number_string) + if(!isnum(new_value)) + if(!istext(number_string) || number_string[1] != "#") + stack_trace("Expected list to only contain numbers or colors but got '[number_string]'") + continue + new_value = number_string + new_values += new_value + return new_values + +/datum/json_reader/color_matrix/ReadJson(list/value) + if(!istype(value)) + CRASH("Expected a list but got [value]") + if(length(value) > 5 || length(value) < 4) + CRASH("Color matrix must contain 4 or 5 rows") + var/list/new_values = list() + for(var/list/row in value) + var/list/interpreted_row = list() + if(!istype(row) || length(row) != 4) + stack_trace("Expected list to contain further row lists with exactly 4 entries") + interpreted_row = list(0, 0, 0, 0) + continue + for(var/number in row) + if(!isnum(number)) + stack_trace("Each color matrix row must only contain numbers") + interpreted_row += 0 + else + interpreted_row += number + new_values += interpreted_row + return new_values + +/datum/json_reader/blend_mode + var/static/list/blend_modes = list( + "add" = ICON_ADD, + "subtract" = ICON_SUBTRACT, + "multiply" = ICON_MULTIPLY, + "or" = ICON_OR, + "overlay" = ICON_OVERLAY, + "underlay" = ICON_UNDERLAY, + ) + +/datum/json_reader/blend_mode/ReadJson(value) + var/new_value = blend_modes[lowertext(value)] + if(isnull(new_value)) + CRASH("Blend mode expected but got '[value]'") + return new_value + +/datum/json_reader/greyscale_config/ReadJson(value) + var/newvalue = SSgreyscale.configurations[value] + if(!newvalue) + CRASH("Greyscale configuration type expected but got '[value]'") + return newvalue diff --git a/code/datums/greyscale/layer.dm b/code/datums/greyscale/layer.dm new file mode 100644 index 000000000000..06a001c1ad83 --- /dev/null +++ b/code/datums/greyscale/layer.dm @@ -0,0 +1,156 @@ +/datum/greyscale_layer + var/layer_type + var/list/color_ids + var/blend_mode + + var/static/list/json_readers + +/datum/greyscale_layer/New(icon_file, list/json_data) + if(!json_readers) + json_readers = list() + for(var/path in subtypesof(/datum/json_reader)) + json_readers[path] = new path + + json_data -= "type" // This is used to look us up and doesn't need to be verified like the rest of the data + + ReadJsonData(json_data) + Initialize(icon_file) + +/// Override this to do initial set up +/datum/greyscale_layer/proc/Initialize(icon_file) + return + +/// Override this if you need to do something during a full config refresh from disk, return TRUE if something was changed +/datum/greyscale_layer/proc/DiskRefresh() + return FALSE + +/// Handles the processing of the json data and conversion to correct value types. +/// Will error on incorrect, missing, or unexpected values. +/datum/greyscale_layer/proc/ReadJsonData(list/json_data) + var/list/required_values = list() + var/list/optional_values = list() + GetExpectedValues(required_values, optional_values) + for(var/keyname in json_data) + if(required_values[keyname] && optional_values[keyname]) + stack_trace("Key '[keyname]' found in both required and optional lists. Make sure keys are only in one or the other.") + continue + if(!required_values[keyname] && !optional_values[keyname]) + stack_trace("Unknown key found in json for [src]: '[keyname]'") + continue + if(!(keyname in vars)) + stack_trace("[src] expects a value from '[keyname]' but has no var to hold the output.") + continue + var/datum/json_reader/reader = required_values[keyname] || optional_values[keyname] + reader = json_readers[reader] + if(!reader) + stack_trace("[src] has an invalid json reader type '[required_values[keyname]]' for key '[keyname]'.") + continue + vars[keyname] = reader.ReadJson(json_data[keyname]) + + // Final check to make sure we got everything we needed + for(var/keyname in required_values) + if(isnull(json_data[keyname])) + stack_trace("[src] is missing required json data key '[keyname]'.") + +/// Gathers information from the layer about what variables are expected in the json. +/// Override and add to the two argument lists if you want extra information in your layer. +/// The lists are formatted like keyname:keytype_define. +/// The key name is assigned to the var named the same on the layer type. +/datum/greyscale_layer/proc/GetExpectedValues(list/required_values, list/optional_values) + optional_values[NAMEOF(src, color_ids)] = /datum/json_reader/number_color_list + required_values[NAMEOF(src, blend_mode)] = /datum/json_reader/blend_mode + +/// Use this proc for extra verification needed by a particular layer, gets run after all greyscale configs have finished reading their json files. +/datum/greyscale_layer/proc/CrossVerify() + return + +/// Used to actualy create the layer using the given colors +/// Do not override, use InternalGenerate instead +/datum/greyscale_layer/proc/Generate(list/colors, list/render_steps, icon/new_icon) + var/list/processed_colors = list() + for(var/i in color_ids) + if(isnum(i)) + processed_colors += colors[i] + else + processed_colors += i + var/icon/copy_of_new_icon = icon(new_icon) // Layers shouldn't be modifying it directly, this is just for them to reference + return InternalGenerate(processed_colors, render_steps, copy_of_new_icon) + +/// Override this to implement layers. +/// The colors var will only contain colors that this layer is configured to use. +/datum/greyscale_layer/proc/InternalGenerate(list/colors, list/render_steps, icon/new_icon) + +//////////////////////////////////////////////////////// +// Subtypes + +/// The most basic greyscale layer; a layer which is created from a single icon_state in the given icon file +/datum/greyscale_layer/icon_state + layer_type = "icon_state" + var/icon_state + var/icon/icon + var/color_id + +/datum/greyscale_layer/icon_state/Initialize(icon_file) + . = ..() + var/list/icon_states = icon_states(icon_file) + if(!(icon_state in icon_states)) + CRASH("Configured icon state \[[icon_state]\] was not found in [icon_file]. Double check your json configuration.") + icon = new(icon_file, icon_state) + + if(length(color_ids) > 1) + CRASH("Icon state layers can not have more than one color id") + +/datum/greyscale_layer/icon_state/GetExpectedValues(list/required_values, list/optional_values) + . = ..() + required_values[NAMEOF(src, icon_state)] = /datum/json_reader/text + +/datum/greyscale_layer/icon_state/InternalGenerate(list/colors, list/render_steps, icon/new_icon) + . = ..() + var/icon/generated_icon = icon(icon) + if(length(colors)) + generated_icon.Blend(colors[1], ICON_MULTIPLY) + return generated_icon + +/// A layer to modify the previous layer's colors with a color matrix +/datum/greyscale_layer/color_matrix + layer_type = "color_matrix" + var/list/color_matrix + +/datum/greyscale_layer/color_matrix/GetExpectedValues(list/required_values, list/optional_values) + . = ..() + required_values[NAMEOF(src, color_matrix)] = /datum/json_reader/color_matrix + +/datum/greyscale_layer/color_matrix/InternalGenerate(list/colors, list/render_steps, icon/new_icon) + . = ..() + new_icon.MapColors(arglist(color_matrix)) + return new_icon + +/// A layer created by using another greyscale icon's configuration +/datum/greyscale_layer/reference + layer_type = "reference" + var/icon_state = "" + var/datum/greyscale_config/reference_type + +/datum/greyscale_layer/reference/GetExpectedValues(list/required_values, list/optional_values) + . = ..() + optional_values[NAMEOF(src, icon_state)] = /datum/json_reader/text + required_values[NAMEOF(src, reference_type)] = /datum/json_reader/greyscale_config + +/datum/greyscale_layer/reference/DiskRefresh() + . = ..() + return reference_type.Refresh(loadFromDisk=TRUE) + +/datum/greyscale_layer/reference/CrossVerify() + . = ..() + if(!reference_type.icon_states[icon_state]) + CRASH("[src] expects icon_state '[icon_state]' but referenced configuration '[reference_type]' does not have it.") + +/datum/greyscale_layer/reference/InternalGenerate(list/colors, list/render_steps, icon/new_icon) + var/icon/generated_icon + if(render_steps) + var/list/reference_data = list() + generated_icon = reference_type.GenerateBundle(colors, reference_data, new_icon) + render_steps += reference_data[icon_state] + else + generated_icon = reference_type.Generate(colors.Join(), new_icon) + return icon(generated_icon, icon_state) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index c401a9aec7a9..a1f4156126f7 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -373,6 +373,9 @@ /datum/preset_holoimage/nanotrasenprivatesecurity outfit_type = /datum/outfit/nanotrasensoldiercorpse2 +/datum/preset_holoimage/cc_official + outfit_type = /datum/outfit/centcom/official + /datum/preset_holoimage/gorilla nonhuman_mobtype = /mob/living/simple_animal/hostile/gorilla diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 653d7ddee9a7..011d7be99e66 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -105,19 +105,11 @@ var/damage = rand(A.get_punchdamagelow(), A.get_punchdamagehigh()) var/atk_verb = A.dna.species.attack_verb + var/atk_effect = A.dna.species.attack_effect if(!(D.mobility_flags & MOBILITY_STAND)) atk_verb = "kick" - - switch(atk_verb) - if("kick") - A.do_attack_animation(D, ATTACK_EFFECT_KICK) - if("slash") - A.do_attack_animation(D, ATTACK_EFFECT_CLAW) - if("smash") - A.do_attack_animation(D, ATTACK_EFFECT_SMASH) - else - A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - + atk_effect = ATTACK_EFFECT_KICK + A.do_attack_animation(D, atk_effect) if(!damage) playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1) D.visible_message(span_warning("[A] has attempted to [atk_verb] [D]!"), \ diff --git a/code/datums/martial/reverbpalm.dm b/code/datums/martial/reverbpalm.dm index d92317aa06bf..2852c7075a2f 100644 --- a/code/datums/martial/reverbpalm.dm +++ b/code/datums/martial/reverbpalm.dm @@ -48,9 +48,7 @@ //animation procs //knocking them down -/datum/martial_art/reverberating_palm/proc/footsies(mob/living/target, var/suplex = FALSE) - if(suplex) - animate(target, transform = matrix(180, MATRIX_ROTATE), time = 0 SECONDS, loop = 0) +/datum/martial_art/reverberating_palm/proc/footsies(mob/living/target) if(target.mobility_flags & MOBILITY_STAND) animate(target, transform = matrix(90, MATRIX_ROTATE), time = 0 SECONDS, loop = 0) return @@ -88,7 +86,7 @@ return if(H.a_intent == INTENT_DISARM) rush(H) - if(H.a_intent == INTENT_HARM && isliving(target)) + if(H.a_intent == INTENT_HARM && isliving(target) && (get_dist(H, target) <= 1)) suplex(H,target) if(H.a_intent == INTENT_GRAB) lariat(H) @@ -103,14 +101,14 @@ return COOLDOWN_START(src, next_palm, COOLDOWN_RPALM) var/obj/item/melee/overcharged_emitter/B = new() - user.visible_message(span_userdanger("[user]'s left arm begins crackling loudly!")) + user.visible_message(span_userdanger("[user]'s right arm begins crackling loudly!")) playsound(user,'sound/effects/beepskyspinsabre.ogg', 60, 1) if(do_after(user, 2 SECONDS, user, timed_action_flags = IGNORE_USER_LOC_CHANGE)) - if(!user.put_in_l_hand(B)) - to_chat(user, span_warning("You can't do this with your left hand full!")) + if(!user.put_in_r_hand(B)) + to_chat(user, span_warning("You can't do this with your right hand full!")) else user.visible_message(span_danger("[user]'s arm begins shaking violently!")) - if(user.active_hand_index % 2 == 0) + if(user.active_hand_index % 2 == 1) user.swap_hand(0) //do cooldown @@ -137,9 +135,8 @@ to_chat(user, span_warning("You can't do that yet!")) return COOLDOWN_START(src, next_suplex, COOLDOWN_SUPLEX) - footsies(target, TRUE) + footsies(target) var/turf/Q = get_step(get_turf(user), turn(user.dir,180)) - user.visible_message(span_warning("[user] outstretches [user.p_their()] arm and goes for a grab!")) wakeup(target) for(var/mob/living/L in Q.contents) damagefilter(user, L, simpledam, persondam, borgdam) @@ -147,10 +144,19 @@ target.forceMove(Z) damagefilter(user, target, simpledam, persondam, borgdam) if(isanimal(target)) + if(istype(target, /mob/living/simple_animal/hostile/megafauna/bubblegum)) + var/mob/living/simple_animal/hostile/megafauna/bubblegum/B = target + var/turf/D = get_step(Q, turn(user.dir,180)) + if(B.charging) + B.adjustBruteLoss(50) + B.forceMove(D) + B.visible_message(span_warning("[B] is caught and thrown behind [user]!")) + playsound(target, 'sound/effects/explosion1.ogg', 60, 1) + shake_camera(user, 1, 2) + return if(target.stat == DEAD) target.visible_message(span_warning("[target] crashes and explodes!")) target.gib() - wakeup(target) to_chat(user, span_warning("[user] suplexes [target] against [Q]!")) to_chat(target, span_userdanger("[user] crushes you against [Q]!")) playsound(target, 'sound/effects/meteorimpact.ogg', 60, 1) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 4f2530061adb..a4b161fb1961 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -186,6 +186,7 @@ AddComponent(/datum/component/two_handed, \ force_wielded = 14, \ ) + AddComponent(/datum/component/cleave_attack, arc_size=180, requires_wielded=TRUE) /obj/item/melee/bostaff/update_icon_state() . = ..() diff --git a/code/datums/martial/worldbreaker.dm b/code/datums/martial/worldbreaker.dm index 7990d46513a7..46bd1bb98e2c 100644 --- a/code/datums/martial/worldbreaker.dm +++ b/code/datums/martial/worldbreaker.dm @@ -423,7 +423,7 @@ dumpster.do_flush() drop() return - var/reduction = thing.obj_integrity + var/reduction = thing.get_integrity() thing.take_damage(remaining_damage) remaining_damage -= reduction if(thing.density) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 906c17af66f9..8a91c5e0c167 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -7,11 +7,14 @@ Simple datum which is instanced once per type and is used for every object of sa /datum/material var/name = "material" - var/desc = "its..stuff." + var/desc = "It's...stuff." // I'm stuff :stuff: ///Var that's mostly used by science machines to identify specific materials, should most likely be phased out at some point var/id = "mat" ///Base color of the material, is used for greyscale. Item isn't changed in color if this is null. + ///Deprecated, use greyscale_color instead. var/color + ///Determines the color palette of the material. Formatted the same as atom/var/greyscale_colors + var/greyscale_colors ///Base alpha of the material, is used for greyscale icons. var/alpha ///Materials "Traits". its a map of key = category | Value = Bool. Used to define what it can be used for.gold @@ -24,16 +27,48 @@ Simple datum which is instanced once per type and is used for every object of sa var/strength_modifier = 1 ///This is a modifier for integrity, and resembles the strength of the material var/integrity_modifier = 1 + ///what texture icon state to overlay + var/texture_layer_icon_state + ///a cached icon for the texture filter + var/cached_texture_filter_icon + +/** Handles initializing the material. + * + * Arugments: + * - _id: The ID the material should use. Overrides the existing ID. + */ +/datum/material/proc/Initialize(_id, ...) + if(_id) + id = _id + else if(isnull(id)) + id = type + + if(texture_layer_icon_state) + cached_texture_filter_icon = icon('icons/materials/composite.dmi', texture_layer_icon_state) + + return TRUE ///This proc is called when the material is added to an object. /datum/material/proc/on_applied(atom/source, amount, material_flags) - if(!(material_flags & MATERIAL_NO_COLOR)) //Prevent changing things with pre-set colors, to keep colored toolboxes their looks for example + if(material_flags & MATERIAL_COLOR) //Prevent changing things with pre-set colors, to keep colored toolboxes their looks for example if(color) //Do we have a custom color? source.add_atom_colour(color, FIXED_COLOUR_PRIORITY) if(alpha) source.alpha = alpha + if(texture_layer_icon_state) + ADD_KEEP_TOGETHER(source, MATERIAL_SOURCE(src)) + source.add_filter("material_texture_[name]",1,layering_filter(icon=cached_texture_filter_icon,blend_mode=BLEND_INSET_OVERLAY)) - if(istype(source, /obj)) //objs + if(material_flags & MATERIAL_GREYSCALE) + var/config_path = get_greyscale_config_for(source.greyscale_config) + source.set_greyscale(greyscale_colors, config_path) + + if(alpha < 255) + source.opacity = FALSE + if(material_flags & MATERIAL_ADD_PREFIX) + source.name = "[name] [source.name]" + + if(isobj(source)) //objs on_applied_obj(source, amount, material_flags) source.mat_update_desc(src) @@ -44,50 +79,95 @@ Simple datum which is instanced once per type and is used for every object of sa ///This proc is called when the material is added to an object specifically. /datum/material/proc/on_applied_obj(obj/o, amount, material_flags) - var/new_max_integrity = CEILING(o.max_integrity * integrity_modifier, 1) - // This is to keep the same damage relative to the max integrity of the object - o.obj_integrity = (o.obj_integrity / o.max_integrity) * new_max_integrity - o.max_integrity = new_max_integrity - o.force *= strength_modifier - o.throwforce *= strength_modifier + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/new_max_integrity = CEILING(o.max_integrity * integrity_modifier, 1) + // This is to keep the same damage relative to the max integrity of the object + o.modify_max_integrity(new_max_integrity, FALSE) + o.force *= strength_modifier + o.throwforce *= strength_modifier + + if(!isitem(o)) + return + var/obj/item/item = o + if(material_flags & MATERIAL_GREYSCALE) + var/worn_path = get_greyscale_config_for(item.greyscale_config_worn) + var/lefthand_path = get_greyscale_config_for(item.greyscale_config_inhand_left) + var/righthand_path = get_greyscale_config_for(item.greyscale_config_inhand_right) + item.set_greyscale( + new_worn_config = worn_path, + new_inhand_left = lefthand_path, + new_inhand_right = righthand_path + ) + +/datum/material/proc/on_applied_turf(turf/T, amount, material_flags) + return + +/datum/material/proc/get_greyscale_config_for(datum/greyscale_config/config_path) + if(!config_path) + return + for(var/datum/greyscale_config/path as anything in subtypesof(config_path)) + if(type != initial(path.material_skin)) + continue + return path ///This proc is called when the material is removed from an object. -/datum/material/proc/on_removed(atom/source, material_flags) - if(!(material_flags & MATERIAL_NO_COLOR)) //Prevent changing things with pre-set colors, to keep colored toolboxes their looks for example +/datum/material/proc/on_removed(atom/source, amount, material_flags) + if(material_flags & MATERIAL_COLOR) //Prevent changing things with pre-set colors, to keep colored toolboxes their looks for example if(color) source.remove_atom_colour(FIXED_COLOUR_PRIORITY, color) + if(texture_layer_icon_state) + source.remove_filter("material_texture_[name]") + REMOVE_KEEP_TOGETHER(source, MATERIAL_SOURCE(src)) source.alpha = initial(source.alpha) - if(istype(source, /obj)) //objs - on_removed_obj(source, material_flags) + if(material_flags & MATERIAL_GREYSCALE) + source.set_greyscale(initial(source.greyscale_colors), initial(source.greyscale_config)) + + if(material_flags & MATERIAL_ADD_PREFIX) + source.name = initial(source.name) + + if(isobj(source)) //objs + on_removed_obj(source, amount, material_flags) + + if(istype(source, /turf)) //turfs + on_removed_turf(source, amount, material_flags) ///This proc is called when the material is removed from an object specifically. /datum/material/proc/on_removed_obj(obj/o, amount, material_flags) - var/new_max_integrity = initial(o.max_integrity) - // This is to keep the same damage relative to the max integrity of the object - o.obj_integrity = (o.obj_integrity / o.max_integrity) * new_max_integrity + if(material_flags & MATERIAL_AFFECT_STATISTICS) + o.modify_max_integrity(initial(o.max_integrity), FALSE) + o.force = initial(o.force) + o.throwforce = initial(o.throwforce) + + if(isitem(o) && (material_flags & MATERIAL_GREYSCALE)) + var/obj/item/item = o + item.set_greyscale( + new_worn_config = initial(item.greyscale_config_worn), + new_inhand_left = initial(item.greyscale_config_inhand_left), + new_inhand_right = initial(item.greyscale_config_inhand_right) + ) - o.max_integrity = new_max_integrity - o.force = initial(o.force) - o.throwforce = initial(o.throwforce) +/datum/material/proc/on_removed_turf(turf/T, amount, material_flags) + return + +/** + * This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption. + * Arguments + * * M - person consuming the mat + * * S - (optional) item the mat is contained in (NOT the item with the mat itself) + */ +/datum/material/proc/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + return FALSE /** Returns the composition of this material. - * - * Mostly used for alloys when breaking down materials. - * - * Arguments: - * - amount: The amount of the material to break down. - * - breakdown_flags: Some flags dictating how exactly this material is being broken down. - */ + * + * Mostly used for alloys when breaking down materials. + * + * Arguments: + * - amount: The amount of the material to break down. + * - breakdown_flags: Some flags dictating how exactly this material is being broken down. + */ /datum/material/proc/return_composition(amount=1, breakdown_flags=NONE) return list((src) = amount) // Yes we need the parenthesis, without them BYOND stringifies src into "src" and things break. -/** - * This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption. - * Arguments - * * M - person consuming the mat - * * S - (optional) item the mat is contained in (NOT the item with the mat itself) - */ -/datum/material/proc/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) - return FALSE diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 3012fc6d533a..04623b323c60 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -2,8 +2,9 @@ /datum/material/iron name = "iron" id = "iron" - desc = "Common iron ore often found in sedimentary and igneous layers of the crust." + desc = "A common iron ore often found in sedimentary and igneous layers of the crust." color = "#878687" + greyscale_colors = "#878687" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/metal coin_type = /obj/item/coin/iron @@ -14,6 +15,7 @@ id = "glass" desc = "Glass forged by melting sand." color = "#dae6f0" + greyscale_colors = "#dae6f0" alpha = 210 categories = list(MAT_CATEGORY_RIGID = TRUE) integrity_modifier = 0.1 @@ -24,8 +26,9 @@ /datum/material/silver name = "silver" id = "silver" - desc = "Silver" + desc = "Silver." color = "#bdbebf" + greyscale_colors = "#bdbebf" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/silver coin_type = /obj/item/coin/silver @@ -34,8 +37,9 @@ /datum/material/gold name = "gold" id = "gold" - desc = "Gold" + desc = "Gold. You're rich." color = "#f0972b" + greyscale_colors = "#f0972b" strength_modifier = 1.2 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold @@ -45,8 +49,9 @@ /datum/material/diamond name = "diamond" id = "diamond" - desc = "Highly pressurized carbon" + desc = "Highly pressurized carbon." color = "#22c2d4" + greyscale_colors = "#22c2d4" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond coin_type = /obj/item/coin/diamond @@ -55,8 +60,9 @@ /datum/material/uranium name = "uranium" id = "uranium" - desc = "Uranium" + desc = "Uranium, known for its radioactive properties." color = "#1fb83b" + greyscale_colors = "#1fb83b" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/uranium coin_type = /obj/item/coin/uranium @@ -76,6 +82,7 @@ id = "plasma" desc = "Isn't plasma a state of matter? Oh whatever." color = "#c716b8" + greyscale_colors = "#c716b8" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/plasma coin_type = /obj/item/coin/plasma @@ -95,8 +102,9 @@ /datum/material/bluespace name = "bluespace crystal" id = "bluespace_crystal" - desc = "Crystals with bluespace properties" + desc = "Rare crystals with bluespace properties." color = "#506bc7" + greyscale_colors = "#506bc7" categories = list(MAT_CATEGORY_ORE = TRUE) sheet_type = /obj/item/stack/sheet/bluespace_crystal @@ -104,8 +112,9 @@ /datum/material/bananium name = "bananium" id = "bananium" - desc = "Material with hilarious properties" + desc = "A very rare material with hilarious properties." color = "#fff263" + greyscale_colors = "#fff263" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/bananium coin_type = /obj/item/coin/bananium @@ -125,8 +134,9 @@ /datum/material/titanium name = "titanium" id = "titanium" - desc = "Titanium" + desc = "Titanium." color = "#b3c0c7" + greyscale_colors = "#b3c0c7" strength_modifier = 1.3 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium @@ -135,8 +145,9 @@ /datum/material/plastic name = "plastic" id = "plastic" - desc = "plastic" + desc = "Plastic." color = "#caccd9" + greyscale_colors = "#caccd9" strength_modifier = 0.85 sheet_type = /obj/item/stack/sheet/plastic @@ -146,13 +157,15 @@ id = "biomass" desc = "Organic matter" color = "#735b4d" + greyscale_colors = "#735b4d" strength_modifier = 0.8 //formed when freon react with o2, emits a lot of plasma when heated /datum/material/hot_ice name = "hot ice" - desc = "A weird kind of ice, feels warm to the touch" + desc = "A weird kind of ice, feels warm to the touch." color = "#88cdf1" + greyscale_colors = "#88cdf1" alpha = 150 categories = list(MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/hot_ice @@ -176,8 +189,9 @@ /datum/material/metalhydrogen name = "Metal Hydrogen" - desc = "Solid metallic hydrogen. Some say it should be impossible" + desc = "Solid metallic hydrogen. Some say it should be impossible." color = "#f2d5d7" + greyscale_colors = "#f2d5d7" alpha = 240 categories = list(MAT_CATEGORY_RIGID = TRUE) sheet_type = /obj/item/stack/sheet/mineral/metal_hydrogen @@ -185,7 +199,7 @@ /datum/material/zaukerite name = "zaukerite" - desc = "A light absorbing crystal" + desc = "A light-absorbing crystal." color = COLOR_ALMOST_BLACK categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/zaukerite @@ -201,7 +215,8 @@ /datum/material/dilithium name = "dilithium crystal" id = "dilithium_crystal" - desc = "Crystals with dilithium properties" + desc = "Crystals with dilithium properties." color = "#506bc7" + greyscale_colors = "#506bc7" categories = list(MAT_CATEGORY_ORE = TRUE) sheet_type = /obj/item/stack/sheet/dilithium_crystal diff --git a/code/datums/mocking/client.dm b/code/datums/mocking/client.dm index aa60a5e7a109..7b7b3c8f7902 100644 --- a/code/datums/mocking/client.dm +++ b/code/datums/mocking/client.dm @@ -1,4 +1,40 @@ /// This should match the interface of /client wherever necessary. /datum/client_interface /// Player preferences datum for the client - var/datum/preferences/prefs \ No newline at end of file + var/datum/preferences/prefs + + /// The view of the client, similar to /client/var/view. + var/view = "15x15" + + /// View data of the client, similar to /client/var/view_size. + var/datum/view_data/view_size + + /// Objects on the screen of the client + var/list/screen = list() + + /// The mob the client controls + var/mob/mob + + /// The ckey for this mock interface + var/ckey = "mockclient" + + /// The key for this mock interface + var/key = "mockclient" + + /// client prefs + var/fps + var/hotkeys + var/tgui_say + var/typing_indicators + +/datum/client_interface/proc/IsByondMember() + return FALSE + +/datum/client_interface/New(key) + ..() + if(key) + src.key = key + ckey = ckey(key) + +/datum/client_interface/proc/set_macros() + return diff --git a/code/datums/mutations/_combined.dm b/code/datums/mutations/_combined.dm index 6a3be6e5a431..4c65979db12b 100644 --- a/code/datums/mutations/_combined.dm +++ b/code/datums/mutations/_combined.dm @@ -13,10 +13,6 @@ /* RECIPES */ -/datum/generecipe/mindread - required = "/datum/mutation/human/antenna; /datum/mutation/human/paranoia" - result = MINDREAD - /datum/generecipe/shock required = "/datum/mutation/human/insulated; /datum/mutation/human/radioactive" result = SHOCKTOUCH @@ -30,5 +26,5 @@ result = ANTIGLOWY /datum/generecipe/cerebral - required = "/datum/mutation/human/insulated; /datum/mutation/human/mindreader" + required = "/datum/mutation/human/insulated; /datum/mutation/human/unintelligible" result = CEREBRAL diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index a211e2ec9748..ae03cd233730 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -28,91 +28,3 @@ /datum/mutation/human/antenna/get_visual_indicator() return visual_indicators[type][1] -/datum/mutation/human/mindreader - name = "Mind Reader" - desc = "The affected person can look into the recent memories of others." - quality = POSITIVE - text_gain_indication = span_notice("You hear distant voices at the corners of your mind.") - text_lose_indication = span_notice("The distant voices fade.") - power_path = /datum/action/cooldown/spell/pointed/mindread - instability = 40 - difficulty = 8 - locked = TRUE - -/datum/action/cooldown/spell/pointed/mindread - name = "Mindread" - desc = "Read the target's mind." - button_icon_state = "mindread" - cooldown_time = 5 SECONDS - spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC - antimagic_flags = MAGIC_RESISTANCE_MIND - ranged_mousepointer = 'icons/effects/mouse_pointers/mindswap_target.dmi' - -/datum/action/cooldown/spell/pointed/mindread/is_valid_target(atom/cast_on) - if(!isliving(cast_on)) - return FALSE - var/mob/living/living_cast_on = cast_on - if(!living_cast_on.mind) - to_chat(owner, span_warning("[cast_on] has no mind to read!")) - return FALSE - if(living_cast_on.stat == DEAD) - to_chat(owner, span_warning("[cast_on] is dead!")) - return FALSE - - return TRUE - -/datum/action/cooldown/spell/pointed/mindread/cast(mob/living/cast_on) - . = ..() - if(cast_on.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) - to_chat(owner, span_warning("As you reach into [cast_on]'s mind, \ - you are stopped by a mental blockage. It seems you've been foiled.")) - return - - if(cast_on == owner) - to_chat(owner, span_warning("You plunge into your mind... Yep, it's your mind.")) - return - - to_chat(owner, span_boldnotice("You plunge into [cast_on]'s mind...")) - if(prob(20)) - // chance to alert the read-ee - to_chat(cast_on, span_danger("You feel something foreign enter your mind.")) - - var/list/recent_speech = list() - var/list/say_log = list() - var/log_source = cast_on.logging - //this whole loop puts the read-ee's say logs into say_log in an easy to access way - for(var/log_type in log_source) - var/nlog_type = text2num(log_type) - if(nlog_type & LOG_SAY) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - say_log = reverse_range(reversed.Copy()) - break - - for(var/spoken_memory in say_log) - //up to 3 random lines of speech, favoring more recent speech - if(length(recent_speech) >= 3) - break - if(prob(50)) - continue - // log messages with tags like telepathy are displayed like "(Telepathy to Ckey/(target)) "greetings""" - // by splitting the text by using a " delimiter, we can grab JUST the greetings part - recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] - - if(length(recent_speech)) - to_chat(owner, span_boldnotice("You catch some drifting memories of their past conversations...")) - for(var/spoken_memory in recent_speech) - to_chat(owner, span_notice("[recent_speech[spoken_memory]]")) - - if(iscarbon(cast_on)) - var/mob/living/carbon/carbon_cast_on = cast_on - to_chat(owner, span_boldnotice("You find that their intent is to [carbon_cast_on.a_intent]...")) - to_chat(owner, span_boldnotice("You uncover that [carbon_cast_on.p_their()] true identity is [carbon_cast_on.mind.name].")) - -/datum/mutation/human/mindreader/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) - ..() - if(!(type in visual_indicators)) - visual_indicators[type] = list(mutable_appearance('icons/effects/genetics.dmi', "antenna", -FRONT_MUTATIONS_LAYER+1)) - -/datum/mutation/human/mindreader/get_visual_indicator() - return visual_indicators[type][1] diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index d19b16310078..5c23c96e2fd1 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -103,7 +103,7 @@ id = "empty-shell" suffix = "emptyshell.dmm" name = "Empty Shell" - description = "Cosy, rural property available for young professional couple. Only twelve parsecs from the nearest hyperspace lane!" + description = "Cosy, rural property available for young professional couple. Only twelve parsecs from the nearest gigabeacon!" /datum/map_template/ruin/space/gas_the_lizards id = "gas-the-lizards" diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index ffeb5067fe8b..6089eb84b98a 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -1301,6 +1301,45 @@ for(var/i in S.damage_coeff) S.damage_coeff[i] /= power +/datum/status_effect/exposed/harpooned + id = "harpooned" + duration = 2 SECONDS + ///damage multiplier + power = 1.3 + +/datum/status_effect/exposed/harpooned/on_apply() + . = ..() + if(.) + owner.add_filter("exposed", 2, list("type" = "outline", "color" = COLOR_RED, "size" = 1)) + + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.physiology.brute_mod *= power + H.physiology.burn_mod *= power + H.physiology.tox_mod *= power + H.physiology.oxy_mod *= power + H.physiology.clone_mod *= power + H.physiology.stamina_mod *= power + else if(isanimal(owner)) + var/mob/living/simple_animal/S = owner + for(var/i in S.damage_coeff) + S.damage_coeff[i] *= power + +/datum/status_effect/exposed/harpooned/on_remove() + owner.remove_filter("exposed") + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.physiology.brute_mod /= power + H.physiology.burn_mod /= power + H.physiology.tox_mod /= power + H.physiology.oxy_mod /= power + H.physiology.clone_mod /= power + H.physiology.stamina_mod /= power + else if(isanimal(owner)) + var/mob/living/simple_animal/S = owner + for(var/i in S.damage_coeff) + S.damage_coeff[i] /= power + /datum/status_effect/knuckled id = "knuckle_wound" duration = 10 SECONDS diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index 86481fcae6a2..a351381d1a0a 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -147,6 +147,9 @@ // Over 11, Light drinkers will constantly gain slurring up to 10 seconds of slurring. if(HAS_TRAIT(owner, TRAIT_LIGHT_DRINKER) & (drunk_value >= 11)) owner.adjust_slurring_up_to(2.4 SECONDS, 10 SECONDS) + if(HAS_TRAIT(owner, TRAIT_DRUNK_HEALING) & (drunk_value >= 11)) // To save headache this will be separate for drunken resilience & effects stack with lower tiers + owner.adjustBruteLoss(-0.1, FALSE) + owner.adjustFireLoss(-0.06, FALSE) // Over 41, we have a 30% chance to gain confusion, and we will always have 20 seconds of dizziness. if(drunk_value >= 41) @@ -155,6 +158,9 @@ owner.set_dizzy_if_lower(20 SECONDS) ADD_TRAIT(src, TRAIT_SURGERY_PREPARED, "drunk") + if(HAS_TRAIT(owner, TRAIT_DRUNK_HEALING)) + owner.adjustBruteLoss(-0.2, FALSE) + owner.adjustFireLoss(-0.09, FALSE) // Over 51, we have a 3% chance to gain a lot of confusion and vomit, and we will always have 50 seconds of dizziness and normal drinkers will start to slur if(drunk_value >= 51) @@ -170,6 +176,9 @@ // Over 71, we will constantly have blurry eyes if(drunk_value >= 71) owner.adjust_eye_blur(drunk_value * 2 - 140) + if(HAS_TRAIT(owner, TRAIT_DRUNK_HEALING)) + owner.adjustBruteLoss(-0.1, FALSE) + owner.adjustFireLoss(-0.05, FALSE) // Over 81, we will gain constant toxloss and experienced drunks will now begin to slur if(drunk_value >= 81) @@ -191,10 +200,16 @@ else to_chat(owner, span_warning("Just a quick nap...")) owner.Sleeping(90 SECONDS) + if(HAS_TRAIT(owner, TRAIT_DRUNK_HEALING)) + owner.adjustBruteLoss(-0.05, FALSE) + owner.adjustFireLoss(-0.05, FALSE) // And finally, over 100 - let's be honest, you shouldn't be alive by now. if(drunk_value >= 101) owner.adjustToxLoss(2) + if(HAS_TRAIT(owner, TRAIT_DRUNK_HEALING)) + owner.adjustBruteLoss(-0.15, FALSE) + owner.adjustFireLoss(-0.15, FALSE) /// Status effect for being fully drunk (not tipsy). /atom/movable/screen/alert/status_effect/drunk diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index f9844d1661af..edface0bea5d 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -12,12 +12,8 @@ medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents." /datum/quirk/no_taste/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant drink - qdel(species) - + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant drink if(disallowed_trait) return "You don't have the ability to eat!" return FALSE @@ -33,11 +29,8 @@ medical_record_text = "Patient demonstrates a high tolerance for alcohol." /datum/quirk/alcohol_tolerance/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant drink - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant drink if(disallowed_trait) return "You don't have the ability to drink!" @@ -73,11 +66,8 @@ medical_record_text = "Patient has unusually efficient liver metabolism and can slowly regenerate wounds by drinking alcoholic beverages." /datum/quirk/drunkhealing/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant drink - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant drink if(disallowed_trait) // Cant drink return "You don't have the ability to drink!" @@ -164,10 +154,9 @@ /datum/quirk/night_vision/on_spawn() var/mob/living/carbon/human/H = quirk_holder - var/obj/item/organ/eyes/eyes = H.getorgan(/obj/item/organ/eyes) - if(!eyes || eyes.lighting_cutoff) + if(!istype(H)) //sanity check return - eyes.Insert(H) //refresh their eyesight and vision + H.update_sight()//refresh their eyesight and vision /datum/quirk/photographer name = "Photographer" @@ -241,11 +230,8 @@ species.liked_food = initial(species.liked_food) /datum/quirk/toxic_tastes/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant drink - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant drink if(disallowed_trait) // Cant eat return "You don't have the ability to eat!" @@ -279,11 +265,8 @@ medical_record_text = "Patient demonstrates a disturbing capacity for eating." /datum/quirk/voracious/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant drink - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant drink if(disallowed_trait) // Cant eat return "You don't have the ability to eat!" @@ -343,7 +326,7 @@ to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with an upgraded cybernetic variant.")) /datum/quirk/cyberorgan/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) if(species_type == /datum/species/ipc) // IPCs are already cybernetic return "You already have cybernetic organs!" @@ -369,7 +352,7 @@ value = 0 /datum/quirk/cyberorgan/lungs/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type if(TRAIT_NOBREATH in species.inherent_traits) // species with TRAIT_NOBREATH don't have lungs return "You don't have lungs!" @@ -383,7 +366,7 @@ value = 0 /datum/quirk/cyberorgan/heart/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type if(NOBLOOD in species.species_traits) // species with NOBLOOD don't have a heart return "You don't have a heart!" @@ -397,7 +380,7 @@ value = 0 /datum/quirk/cyberorgan/liver/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type if(TRAIT_TOXINLOVER in species.inherent_traits) // species with TRAIT_TOXINLOVER slowly die when given upgraded livers return "You aren't compatible with upgraded livers!" @@ -412,11 +395,8 @@ medical_record_text = "DNA analysis indicates that the patient's DNA telomeres are still naturally long." /datum/quirk/telomeres_long/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NO_DNA_COPY in species.species_traits) //Can't pick if you have no DNA bruv. - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NO_DNA_COPY in initial(species_type.species_traits)) //Can't pick if you have no DNA bruv. if(disallowed_trait) return "You have no DNA!" @@ -461,7 +441,7 @@ H.grant_language(random_language, TRUE, TRUE, LANGUAGE_MULTILINGUAL) /datum/quirk/multilingual/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type if(species && specific) var/mob/M = new /mob // can't instantiate a language holder without an owner diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index fc63d376dfab..5b970cff5e81 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -27,11 +27,8 @@ medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." /datum/quirk/blooddeficiency/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOBLOOD in species.species_traits) //can't lose blood if your species doesn't have any - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOBLOOD in initial(species_type.species_traits)) //can't lose blood if your species doesn't have any if(disallowed_trait) return "You don't have blood!" @@ -156,11 +153,8 @@ medical_record_text = "Patient demonstrates a low tolerance for alcohol. (Wimp)" /datum/quirk/light_drinker/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) || !(species.inherent_biotypes & MOB_ORGANIC)// Cant drink or process alcohol - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) || !(initial(species_type.inherent_biotypes) & MOB_ORGANIC)// Cant drink or process alcohol if(disallowed_trait) return "You don't have the ability to consume alcohol!" @@ -354,6 +348,14 @@ var/where medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." +/datum/quirk/insanity/check_quirk(datum/preferences/prefs) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (initial(species_type.inherent_biotypes) & MOB_ROBOTIC) + + if(disallowed_trait) + return "You are not illogical." + return ..() + /datum/quirk/insanity/add() var/datum/brain_trauma/mild/reality_dissociation/T = new() var/mob/living/carbon/human/H = quirk_holder @@ -574,11 +576,8 @@ H.reagents.addiction_list.Add(reagent_instance) /datum/quirk/junkie/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = !(species.inherent_biotypes & MOB_ORGANIC) //if you can't process organic chems you couldn't get addicted in the first place - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = !(initial(species_type.inherent_biotypes) & MOB_ORGANIC) //if you can't process organic chems you couldn't get addicted in the first place if(disallowed_trait) return "You don't process normal chemicals!" @@ -643,11 +642,8 @@ /datum/quirk/junkie/drunkard/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = !(species.inherent_biotypes & MOB_ORGANIC) - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = !(initial(species_type.inherent_biotypes) & MOB_ORGANIC) //if you can't process organic chems you couldn't get addicted in the first place if(disallowed_trait) return "You don't process normal chemicals!" @@ -688,11 +684,8 @@ var/cooldown = FALSE /datum/quirk/allergic/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (TRAIT_MEDICALIGNORE in species.inherent_traits) - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = !(TRAIT_MEDICALIGNORE in initial(species_type.inherent_traits)) if(disallowed_trait) return "You don't benefit from the use of medicine." @@ -714,11 +707,8 @@ addtimer(VARSET_CALLBACK(src, cooldown, FALSE), cooldown_time) /datum/quirk/allergic/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = !(species.inherent_biotypes & MOB_ORGANIC) // why would robots be allergic to things - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = !(initial(species_type.inherent_biotypes) & MOB_ORGANIC) if(disallowed_trait) return "You don't process normal chemicals!" @@ -775,11 +765,8 @@ medical_record_text = "Patient appears unable to naturally form blood clots." /datum/quirk/hemophilia/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOBLOOD in species.species_traits) - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOBLOOD in initial(species_type.species_traits)) if(disallowed_trait) return "You can't bleed." @@ -840,11 +827,8 @@ medical_record_text = "DNA analysis indicates that the patient's DNA telomeres are artificially shortened from previous cloner usage." /datum/quirk/telomeres_short/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NO_DNA_COPY in species.species_traits) //Can't pick if you have no DNA bruv. - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NO_DNA_COPY in initial(species_type.species_traits)) //Can't pick if you have no DNA bruv. if(disallowed_trait) return "You have no DNA!" diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index a753caef4ccb..6537e48b2ff9 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -26,10 +26,10 @@ species.disliked_food &= ~MEAT /datum/quirk/vegetarian/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant eat + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant eat qdel(species) if(disallowed_trait) @@ -57,11 +57,8 @@ species.liked_food &= ~PINEAPPLE /datum/quirk/pineapple_liker/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant eat - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant eat if(disallowed_trait) return "You don't have the ability to eat!" @@ -88,11 +85,8 @@ species.disliked_food &= ~PINEAPPLE /datum/quirk/pineapple_hater/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant eat - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant eat if(disallowed_trait) return "You don't have the ability to eat!" @@ -122,11 +116,8 @@ species.disliked_food = initial(species.disliked_food) /datum/quirk/deviant_tastes/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (NOMOUTH in species.species_traits) // Cant eat - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (NOMOUTH in initial(species_type.species_traits)) // Cant eat if(disallowed_trait) return "You don't have the ability to eat!" @@ -182,11 +173,8 @@ to_chat(quirk_holder, span_boldnotice("Your bottle of hair dye spray is [where].")) /datum/quirk/colorist/check_quirk(datum/preferences/prefs) - var/species_type = prefs.read_preference(/datum/preference/choiced/species) - var/datum/species/species = new species_type - - var/disallowed_trait = (HAIR in species.species_traits) // No Hair - qdel(species) + var/datum/species/species_type = prefs.read_preference(/datum/preference/choiced/species) + var/disallowed_trait = (HAIR in initial(species_type.species_traits)) // No Hair if(!disallowed_trait) return "You don't have hair!" diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm index 6113eaaf307a..7cab5105b3a1 100644 --- a/code/datums/wires/vending.dm +++ b/code/datums/wires/vending.dm @@ -10,10 +10,19 @@ add_duds(1) ..() +/datum/wires/vending/interact(mob/user) + var/obj/machinery/vending/V = holder + if(!issilicon(user) && V.seconds_electrified && V.shock(user, 100)) // Just incase + return + + return ..() + /datum/wires/vending/interactable(mob/user) var/obj/machinery/vending/V = holder - if(!issilicon(user) && V.seconds_electrified && V.shock(user, 100)) - return FALSE + if(!issilicon(user) && V.seconds_electrified) + var/mob/living/carbon/carbon_user = user + if (!istype(carbon_user) || carbon_user.should_electrocute(src)) + return FALSE if(V.panel_open) return TRUE @@ -56,6 +65,7 @@ V.seconds_electrified = MACHINE_NOT_ELECTRIFIED else V.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT + V.shock(usr, 100) if(WIRE_IDSCAN) V.scan_id = mend if(WIRE_SPEAKER) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 8be8d4b4b4ef..701d7f3fa561 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -241,7 +241,7 @@ .["real_mode"] = SSticker.mode.name // Key-authed callers may know the truth behind the "secret" - .["security_level"] = get_security_level() + .["security_level"] = SSsecurity_level.get_current_level_as_text() .["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 // Amount of world's ticks in seconds, useful for calculating round duration diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index 21cb09b201d7..164fb7e4e847 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -147,7 +147,7 @@ if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE))) return FALSE else if(limb.scars_covered_by_clothes) - var/num_covers = LAZYLEN(human_victim.clothingonpart(limb)) + var/num_covers = LAZYLEN(human_victim.clothingonpart(limb.body_part)) if(num_covers + get_dist(viewer, victim) >= visibility) return FALSE diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 2f1022eb9b5c..9aa62d38814e 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -22,9 +22,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "space" requires_power = TRUE always_unpowered = TRUE - static_lighting = FALSE + static_lighting = TRUE - base_lighting_alpha = 255 + base_lighting_alpha = 0 base_lighting_color = COLOR_STARLIGHT power_light = FALSE power_equip = FALSE @@ -40,9 +40,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/space/nearstation icon_state = "space_near" - static_lighting = TRUE - base_lighting_alpha = 0 - base_lighting_color = null /area/start name = "start area" @@ -488,6 +485,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station airlock_wires = /datum/wires/airlock/service sound_environment = SOUND_AREA_WOODFLOOR +/area/crew_quarters/public_lounge + name = "Lounge" + icon_state = "bar" + minimap_color = "#5ac866" + mood_bonus = 5 + mood_message = span_nicegreen("I love being in the lounge!\n") + airlock_wires = /datum/wires/airlock/service + /area/crew_quarters/bar/Initialize(mapload) . = ..() GLOB.bar_areas += src @@ -518,7 +523,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/theatre/abandoned name = "Abandoned Theatre" icon_state = "Theatre" - lights_always_start_on = FALSE /area/library name = "Library" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 6f7c4e58b6ad..92cb1053db07 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -135,6 +135,7 @@ /// Whether the lights in this area aren't turned off when it's empty at roundstart var/lights_always_start_on = FALSE + /** * A list of teleport locations diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index 0d8223c0f4cb..ca7cac8aaef2 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -21,3 +21,4 @@ /area/ruin/powered requires_power = FALSE + lights_always_start_on = TRUE diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 494468db88ba..37c511734e47 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -99,7 +99,7 @@ ////////////////////////////Single-area shuttles//////////////////////////// /area/shuttle/transit - name = "Hyperspace" + name = "Bluespace" desc = "Weeeeee" static_lighting = FALSE base_lighting_alpha = 255 diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 5c9686212f5b..79a169c60db5 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -115,6 +115,10 @@ var/base_pixel_x = 0 ///Default pixel y shifting for the atom's icon. var/base_pixel_y = 0 + ///The config type to use for greyscaled sprites. Both this and greyscale_colors must be assigned to work. + var/greyscale_config + ///A string of hex format colors to be used by greyscale sprites, ex: "#0054aa#badcff" + var/greyscale_colors ///the base icon state used for anything that changes their icon state. var/base_icon_state ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() @@ -139,6 +143,20 @@ var/atom/orbit_target //Reference to atom being orbited + ///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 + ///Armor datum used by the atom + var/datum/armor/armor + ///Current integrity, defaults to max_integrity on init + VAR_PRIVATE/atom_integrity + ///Maximum integrity + var/max_integrity = 500 + ///Integrity level when this atom will "break" (whatever that means) 0 if we have no special broken behavior, otherwise is a percentage of at what point the atom breaks. 0.5 being 50% + var/integrity_failure = 0 + ///Damage under this value will be completely ignored + var/damage_deflection = 0 + + var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF /** * Top level of the destroy chain for most atoms @@ -404,6 +422,14 @@ if(sig_return != NONE) return sig_return . = P.on_hit(src, 0, def_zone) + if(uses_integrity) + playsound(src, P.hitsound, 50, 1) + visible_message(span_danger("[src] is hit by \a [P]!"), null, null, COMBAT_MESSAGE_RANGE) + if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object + var/demolition_mult = P.demolition_mod + if(istype(src, /obj/mecha) && P.demolition_mod != 1) //snowflake damage checks for mechs + demolition_mult = istype(src, /obj/mecha/combat) ? min(1, (1 + P.demolition_mod)/2) : (1 + P.demolition_mod)/2 + take_damage(P.damage * demolition_mult, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armour_penetration) ///Return true if we're inside the passed in atom /atom/proc/in_contents_of(container)//can take class or object instance as argument @@ -451,6 +477,18 @@ if(desc) . += desc + if(uses_integrity && atom_integrity < max_integrity) + if(resistance_flags & ON_FIRE) + . += span_warning("It's on fire!") + var/integrity = atom_integrity*100/max_integrity + switch(integrity) + if(66 to 100) + . += "It's slightly damaged." + if(33 to 66) + . += "It's heavily damaged." + if(0 to 33) + . += span_warning("It's falling apart!") + if(custom_materials) for(var/i in custom_materials) var/datum/material/M = i @@ -510,6 +548,31 @@ if(!LAZYLEN(.)) // lol ..length return FALSE +/// Handles updates to greyscale value updates. +/// The colors argument can be either a list or the full color string. +/// Child procs should call parent last so the update happens after all changes. +/atom/proc/set_greyscale(list/colors, new_config) + SHOULD_CALL_PARENT(TRUE) + if(istype(colors)) + colors = colors.Join("") + if(!isnull(colors) && greyscale_colors != colors) // If you want to disable greyscale stuff then give a blank string + greyscale_colors = colors + + if(!isnull(new_config) && greyscale_config != new_config) + greyscale_config = new_config + + update_greyscale() + +/// Checks if this atom uses the GAGS system and if so updates the icon +/atom/proc/update_greyscale() + SHOULD_CALL_PARENT(TRUE) + if(greyscale_colors && greyscale_config) + icon = SSgreyscale.GetColoredIconByType(greyscale_config, greyscale_colors) + if(!smoothing_flags) // This is a bitfield but we're just checking that some sort of smoothing is happening + return + update_atom_colour() + QUEUE_SMOOTH(src) + /** * An atom we are buckled or is contained within us has tried to move * @@ -864,8 +927,32 @@ pixel_y = clamp(new_y, -16, 16) ///Handle melee attack by a mech -/atom/proc/mech_melee_attack(obj/mecha/M, equip_allowed = TRUE) - return +/atom/proc/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) + if(!uses_integrity) + return + M.do_attack_animation(src) + var/play_soundeffect = 0 + var/mech_damtype = M.damtype + punch_force *= M.demolition_mod + if(M.selected) + mech_damtype = M.selected.damtype + play_soundeffect = 1 + else + switch(M.damtype) + if(BRUTE) + if(M.meleesound) + playsound(src, 'sound/weapons/punch4.ogg', 50, 1) + if(BURN) + if(M.meleesound) + playsound(src, 'sound/items/welder.ogg', 50, 1) + if(TOX) + if(M.meleesound) + playsound(src, 'sound/effects/spray2.ogg', 50, 1) + return 0 + else + return 0 + visible_message(span_danger("[M.name] has hit [src]."), null, null, COMBAT_MESSAGE_RANGE) + return take_damage(punch_force, mech_damtype, MELEE, play_soundeffect, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. /** * Called when the atom log's in or out @@ -1012,6 +1099,8 @@ VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EMP, "EMP Pulse") VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") VV_DROPDOWN_OPTION(VV_HK_RADIATE, "Radiate") + if(greyscale_colors) + VV_DROPDOWN_OPTION(VV_HK_MODIFY_GREYSCALE, "Modify greyscale colors") /atom/vv_do_topic(list/href_list) . = ..() diff --git a/code/game/atom/atom_initializing_EXPENSIVE.dm b/code/game/atom/atom_initializing_EXPENSIVE.dm index ae91b1e9fa13..2a6ff2c50d9e 100644 --- a/code/game/atom/atom_initializing_EXPENSIVE.dm +++ b/code/game/atom/atom_initializing_EXPENSIVE.dm @@ -124,9 +124,8 @@ flags_1 |= INITIALIZED_1 SET_PLANE_IMPLICIT(src, plane) - //Yog Code: Someday we'll have GAGs - // if(greyscale_config && greyscale_colors) //we'll check again at item/init for inhand/belt/worn configs. - // update_greyscale() + if(greyscale_config && greyscale_colors) //we'll check again at item/init for inhand/belt/worn configs. + update_greyscale() //atom color stuff if(color) @@ -144,6 +143,15 @@ temp_list[material] = custom_materials[material] //Get the proper instanced version custom_materials = null //Null the list to prepare for applying the materials properly set_custom_materials(temp_list) + + 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 [type] Initialize()") + atom_integrity = max_integrity return INITIALIZE_HINT_NORMAL diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm new file mode 100644 index 000000000000..73c7bf917c60 --- /dev/null +++ b/code/game/atom_defense.dm @@ -0,0 +1,132 @@ + +/// The essential proc to call when an atom must receive damage of any kind. +/atom/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) + if(!uses_integrity) + CRASH("[src] had /atom/proc/take_damage() called on it without it being a type that has uses_integrity = TRUE!") + if(QDELETED(src)) + CRASH("[src] taking damage after deletion") + if(atom_integrity <= 0) + CRASH("[src] taking damage while having <= 0 integrity") + if(sound_effect) + play_attack_sound(damage_amount, damage_type, damage_flag) + if(resistance_flags & INDESTRUCTIBLE) + return + damage_amount = run_atom_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration) + if(damage_amount < DAMAGE_PRECISION) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_TAKE_DAMAGE, damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) & COMPONENT_NO_TAKE_DAMAGE) + return + + . = damage_amount + + update_integrity(atom_integrity - damage_amount) + + //BREAKING FIRST + if(integrity_failure && atom_integrity <= integrity_failure) + atom_break(damage_flag) + + //DESTROYING SECOND + if(atom_integrity <= 0) + atom_destruction(damage_flag) + +/// Proc for recovering atom_integrity. Returns the amount repaired by +/atom/proc/repair_damage(amount) + if(amount <= 0) // We only recover here + return + var/new_integrity = min(max_integrity, atom_integrity + amount) + . = new_integrity - atom_integrity + + update_integrity(new_integrity) + + if(integrity_failure && atom_integrity > integrity_failure) + atom_fix() + +/// Handles the integrity of an atom changing. This must be called instead of changing integrity directly. +/atom/proc/update_integrity(new_value) + SHOULD_NOT_OVERRIDE(TRUE) + if(!uses_integrity) + CRASH("/atom/proc/update_integrity() was called on [src] when it doesnt use integrity!") + var/old_value = atom_integrity + new_value = max(0, new_value) + if(atom_integrity == new_value) + return + atom_integrity = new_value + SEND_SIGNAL(src, COMSIG_ATOM_INTEGRITY_CHANGED, old_value, new_value) + +/// This mostly exists to keep atom_integrity private. Might be useful in the future. +/atom/proc/get_integrity() + SHOULD_BE_PURE(TRUE) + return atom_integrity + +///returns the damage value of the attack after processing the atom's various armor protections +/atom/proc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) + if(!uses_integrity) + 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 + var/armor_protection = 0 + if(damage_flag) + armor_protection = armor.getRating(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) + +///the sound played when the atom is damaged. +/atom/proc/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + switch(damage_type) + if(BRUTE) + if(damage_amount) + playsound(src, 'sound/weapons/smash.ogg', 50, TRUE) + else + playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) + if(BURN) + playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) + +///Called to get the damage that hulks will deal to the atom. +/atom/proc/hulk_damage() + return 150 //the damage hulks do on punches to this atom, is affected by melee armor + +/atom/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal, and attack_slime + if(!uses_integrity) + CRASH("unimplemented /atom/proc/attack_generic()!") + user.do_attack_animation(src) + user.changeNext_move(CLICK_CD_MELEE) + return take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration) + +/// Called after the atom takes damage and integrity is below integrity_failure level +/atom/proc/atom_break(damage_flag) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ATOM_BREAK) + +/// Called when integrity is repaired above the breaking point having been broken before +/atom/proc/atom_fix() + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ATOM_FIX) + +///what happens when the atom's integrity reaches zero. +/atom/proc/atom_destruction(damage_flag) + return + +///changes max_integrity while retaining current health percentage, returns TRUE if the atom got broken. +/atom/proc/modify_max_integrity(new_max, can_break = TRUE, damage_type = BRUTE) + if(!uses_integrity) + CRASH("/atom/proc/modify_max_integrity() was called on [src] when it doesnt use integrity!") + var/current_integrity = atom_integrity + var/current_max = max_integrity + + if(current_integrity != 0 && current_max != 0) + var/percentage = current_integrity / current_max + current_integrity = max(1, round(percentage * new_max)) //don't destroy it as a result + atom_integrity = current_integrity + + max_integrity = new_max + + if(can_break && integrity_failure && current_integrity <= integrity_failure) + atom_break(damage_type) + return TRUE + return FALSE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8b0dab711590..d911cfa58016 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -819,6 +819,13 @@ /atom/movable/proc/forceMove(atom/destination) . = FALSE if(destination) + var/turf/old_turf = get_turf(src) + var/turf/new_turf = get_turf(destination) + if(new_turf && ismob(src)) + var/mob/M = src + if(is_secret_level(new_turf.z) && !M.client?.holder && old_turf.z != new_turf.z) + return + . = doMove(destination) else CRASH("No valid destination passed into forceMove") @@ -927,6 +934,9 @@ if(throwing) return TRUE + if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir) & COMSIG_MOVABLE_ALLOW_SPACEMOVE) + return TRUE + if(!isturf(loc)) return TRUE diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index f3d3ba070582..11e780e65b50 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -282,7 +282,7 @@ Diagnostic HUDs! holder.pixel_y = I.Height() - world.icon_size holder.icon_state = null set_hud_image_inactive(NANITE_HUD) - if(src in SSnanites.nanite_monitored_mobs) + if(HAS_TRAIT_FROM(src, TRAIT_SUITLESS_SENSORS, NANITE_TRAIT)) holder.icon_state = "nanite_ping" set_hud_image_active(NANITE_HUD) @@ -374,7 +374,7 @@ Diagnostic HUDs! var/image/holder = hud_list[DIAG_MECH_HUD] var/icon/I = icon(icon, icon_state, dir) holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(obj_integrity/max_integrity)]" + holder.icon_state = "huddiag[RoundDiagBar(atom_integrity/max_integrity)]" set_hud_image_active(DIAG_MECH_HUD) /obj/mecha/proc/diag_hud_set_mechcell() diff --git a/code/game/gamemodes/bloodsuckers/bloodsucker.dm b/code/game/gamemodes/bloodsuckers/bloodsucker.dm index 7ca2f485636a..5e46ade71002 100644 --- a/code/game/gamemodes/bloodsuckers/bloodsucker.dm +++ b/code/game/gamemodes/bloodsuckers/bloodsucker.dm @@ -4,7 +4,7 @@ report_type = "Bloodsucker" antag_flag = ROLE_BLOODSUCKER false_report_weight = 10 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("AI", "Cyborg", "Synthetic") protected_jobs = list( "Captain", "Head of Personnel", "Head of Security", "Research Director", "Chief Engineer", "Chief Medical Officer", "Curator", diff --git a/code/game/gamemodes/bloodsuckers/traitorsuckers.dm b/code/game/gamemodes/bloodsuckers/traitorsuckers.dm index 1d33bf2a7f45..c0471ab308ab 100644 --- a/code/game/gamemodes/bloodsuckers/traitorsuckers.dm +++ b/code/game/gamemodes/bloodsuckers/traitorsuckers.dm @@ -4,7 +4,7 @@ report_type = "traitorsucker" false_report_weight = 10 traitors_possible = 3 // Hard limit on Traitors if scaling is turned off - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("AI", "Cyborg", "Synthetic") protected_jobs = list( "Captain", "Head of Personnel", "Head of Security", "Research Director", "Chief Engineer", "Chief Medical Officer", "Curator", diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index fc7417dd8e6a..c6cc151ebaae 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -5,10 +5,11 @@ /datum/game_mode/traitor/bros name = "traitor+brothers" config_tag = "traitorbro" - restricted_jobs = list("AI", "Cyborg") - required_players = 8 //yogs - just a minor change + restricted_jobs = list("AI", "Cyborg", "Synthetic") + required_players = 20 //yogs - just a minor change title_icon = "ss13" + announce_span = "danger" announce_text = "There are Syndicate agents and Blood Brothers on the station!\n\ Traitors: Accomplish your objectives.\n\ diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 38d9de8ed8dd..b88db9ecf2d5 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -79,9 +79,9 @@ GLOBAL_VAR(changeling_team_objective_type) report_type = "changeling" antag_flag = ROLE_CHANGELING false_report_weight = 10 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("AI", "Cyborg", "Synthetic") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") //YOGS - added hop and brig physician - required_players = 25 + required_players = 20 required_enemies = 2 recommended_enemies = 4 reroll_friendly = 1 @@ -201,22 +201,27 @@ GLOBAL_VAR(changeling_team_objective_type) if((user.vars[slot] && !istype(user.vars[slot], GLOB.slot2type[slot])) || !(chosen_prof.exists_list[slot])) continue - var/obj/item/C + var/obj/item/new_flesh_item var/equip = 0 if(!user.vars[slot]) var/thetype = GLOB.slot2type[slot] equip = 1 - C = new thetype(user) + new_flesh_item = new thetype(user) else if(istype(user.vars[slot], GLOB.slot2type[slot])) - C = user.vars[slot] + new_flesh_item = user.vars[slot] + + new_flesh_item.appearance = chosen_prof.appearance_list[slot] + new_flesh_item.name = chosen_prof.name_list[slot] + new_flesh_item.flags_cover = chosen_prof.flags_cover_list[slot] + new_flesh_item.lefthand_file = chosen_prof.lefthand_file_list[slot] + new_flesh_item.righthand_file = chosen_prof.righthand_file_list[slot] + new_flesh_item.item_state = chosen_prof.inhand_icon_state_list[slot] + new_flesh_item.mob_overlay_icon = chosen_prof.worn_icon_list[slot] + new_flesh_item.worn_icon_state = chosen_prof.worn_icon_state_list[slot] - C.appearance = chosen_prof.appearance_list[slot] - C.name = chosen_prof.name_list[slot] - C.flags_cover = chosen_prof.flags_cover_list[slot] - C.item_state = chosen_prof.item_state_list[slot] if(equip) - user.equip_to_slot_or_del(C, GLOB.slot2slot[slot]) + user.equip_to_slot_or_del(new_flesh_item, GLOB.slot2slot[slot]) for(var/stored_scar_line in chosen_prof.stored_scars) var/datum/scar/attempted_fake_scar = user.load_scar(stored_scar_line) if(attempted_fake_scar) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index cb1c5b13c84f..d8db3d9543d3 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -4,8 +4,8 @@ report_type = "traitorchan" false_report_weight = 10 traitors_possible = 3 //hard limit on traitors if scaling is turned off - restricted_jobs = list("AI", "Cyborg") - required_players = 25 + restricted_jobs = list("AI", "Cyborg", "Synthetic") + required_players = 20 required_enemies = 1 // how many of each type are required recommended_enemies = 3 reroll_friendly = 1 diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index ff4d1342521a..f321115dacbc 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -144,7 +144,7 @@ Credit where due: recommended_enemies = 3 enemy_minimum_age = 14 protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") //Silicons can eventually be converted //Yogs: Added Brig Physician - restricted_jobs = list("Chaplain", "Captain") + restricted_jobs = list("Chaplain", "Captain", "Synthetic") announce_span = "brass" announce_text = "Servants of Ratvar are trying to summon the Justiciar!\n\ Servants: Construct defenses to protect the Ark. Sabotage the station!\n\ @@ -274,8 +274,9 @@ Credit where due: ears = /obj/item/radio/headset gloves = /obj/item/clothing/gloves/color/yellow //Take them off if you want belt = /obj/item/storage/belt/utility/servant //Take this off and pour it into a toolbox if you want - backpack_contents = list(/obj/item/storage/box/engineer = 1, \ - /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1) + box = /obj/item/storage/box/survival/engineer + backpack_contents = list(/obj/item/clockwork/replica_fabricator = 1,\ + /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1) var/obj/item/id_type = /obj/item/card/id var/obj/item/modular_computer/pda_type = /obj/item/modular_computer/tablet/pda/preset/basic diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm index a8901ecb720c..e6bd7ba4f7ae 100644 --- a/code/game/gamemodes/clown_ops/clown_ops.dm +++ b/code/game/gamemodes/clown_ops/clown_ops.dm @@ -37,8 +37,8 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate r_pocket = /obj/item/bikehorn id = /obj/item/card/id/syndicate - backpack_contents = list(/obj/item/storage/box/syndie=1,\ - /obj/item/kitchen/knife/combat/survival, + belt = /obj/item/modular_computer/tablet/pda/preset/clown + backpack_contents = list(/obj/item/kitchen/knife/combat/survival,\ /obj/item/reagent_containers/spray/waterflower/lube) implants = list(/obj/item/implant/sad_trombone) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 3c1c015922eb..a7dfa85ac74e 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -14,7 +14,7 @@ //Clown shoes with combat stats and noslip. Of course they still squeak. /obj/item/clothing/shoes/clown_shoes/combat name = "combat clown shoes" - 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." + desc = "A pair of 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 = 60, RAD = 0, FIRE = 70, ACID = 50) @@ -286,16 +286,7 @@ operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/honker/dark - max_equip = 3 - -/obj/mecha/combat/honker/dark/GrantActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Grant(user, src) - - -/obj/mecha/combat/honker/dark/RemoveActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Remove(user) + max_equip = 4 /obj/mecha/combat/honker/dark/add_cell(obj/item/stock_parts/cell/C) if(C) @@ -312,6 +303,8 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/tearstache()//The mousetrap mortar was not up-to-snuff. ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion() + ME.attach(src) /obj/mecha/combat/honker/dark/crew operation_req_access = list() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 00530fe4d1e5..d46e44272ec7 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -39,9 +39,9 @@ report_type = "cult" antag_flag = ROLE_CULTIST false_report_weight = 10 - restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") //Yogs: Added Brig Physician + restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician", "Synthetic") //Yogs: Added Brig Physician protected_jobs = list() - required_players = 29 + required_players = 24 required_enemies = 4 recommended_enemies = 4 enemy_minimum_age = 14 @@ -178,7 +178,7 @@ priority_announce("Figments of an eldritch god are being pulled through the veil anomaly in [bloodstone_areas[1]], [bloodstone_areas[2]], [bloodstone_areas[3]], and [bloodstone_areas[4]]! Destroy any occult structures located in those areas!","Central Command Higher Dimensional Affairs") addtimer(CALLBACK(src, PROC_REF(increase_bloodstone_power)), 30 SECONDS) - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) /datum/game_mode/proc/increase_bloodstone_power() if(!bloodstone_list.len) //check if we somehow ran out of bloodstones @@ -199,14 +199,13 @@ var/anchor_power = 0 //anchor will be faster if there are more stones for(var/obj/structure/destructible/cult/bloodstone/B in bloodstone_list) anchor_power++ - if(B.obj_integrity > anchor_target.obj_integrity) + if(B.get_integrity() > anchor_target.get_integrity()) anchor_target = B SSticker.mode.anchor_bloodstone = anchor_target anchor_target.name = "anchor bloodstone" anchor_target.desc = "It pulses rhythmically with migraine-inducing light. Something is being reflected on every surface, something that isn't quite there..." anchor_target.anchor = TRUE - anchor_target.max_integrity = 1200 - anchor_target.obj_integrity = 1200 + anchor_target.modify_max_integrity(1200, can_break = FALSE) anchor_time2kill -= anchor_power * 1 MINUTES //one minute of bloodfuckery shaved off per surviving bloodstone. anchor_target.set_animate() var/area/A = get_area(anchor_target) diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index c329f724330b..5a1a2f5ccfd1 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -11,7 +11,7 @@ reroll_friendly = 1 enemy_minimum_age = 0 title_icon = "devil" - restricted_jobs = list("Cyborg", "AI") + restricted_jobs = list("Cyborg", "AI", "Synthetic") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") //YOGS - added the hop and brig physician var/traitors_possible = 4 //hard limit on devils if scaling is turned off diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 8acf271cf892..2672ed2d68a1 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -305,8 +305,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(CONFIG_GET(flag/auto_blue_alert)) print_command_report(., "Central Command Status Summary", announce=FALSE) priority_announce(desc, title, ANNOUNCER_INTERCEPT) - if(GLOB.security_level < SEC_LEVEL_BLUE) - set_security_level(SEC_LEVEL_BLUE) + if(SSsecurity_level.get_current_level_as_number() < SEC_LEVEL_BLUE) + SSsecurity_level.set_level(SEC_LEVEL_BLUE) else print_command_report(., "Central Command Status Summary") diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 67ff6e8e5b36..78ee81f798c4 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -63,7 +63,7 @@ antag_datum = /datum/antagonist/traitor antag_flag = ROLE_TRAITOR protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") - restricted_roles = list("AI","Cyborg") + restricted_roles = list("AI","Cyborg", "Synthetic") required_candidates = 1 weight = 7 cost = 10 @@ -82,7 +82,7 @@ antag_datum = /datum/antagonist/rev/head antag_flag = ROLE_REV_HEAD antag_flag_override = ROLE_REV - restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director") + restricted_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Synthetic") enemy_roles = list("AI", "Cyborg", "Security Officer","Detective","Head of Security", "Captain", "Warden") required_enemies = list(2,2,1,1,1,1,1,0,0,0) required_candidates = 1 @@ -198,7 +198,7 @@ antag_flag = ROLE_VAMPIRE antag_datum = /datum/antagonist/vampire protected_roles = list("Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Security Officer", "Chaplain", "Detective", "Warden", "Brig Physician") - restricted_roles = list("AI", "Cyborg") + restricted_roles = list("AI", "Cyborg", "Synthetic") required_candidates = 1 weight = 4 cost = 15 @@ -218,7 +218,7 @@ antag_datum = /datum/antagonist/heretic antag_flag = ROLE_HERETIC protected_roles = list("Chaplain","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") - restricted_roles = list("AI","Cyborg") + restricted_roles = list("AI","Cyborg", "Synthetic") required_candidates = 1 weight = 2 cost = 15 @@ -242,7 +242,7 @@ "Warden", "Security Officer", "Detective", "Brig Physician", "Curator" ) - restricted_roles = list("AI","Cyborg") + restricted_roles = list("AI","Cyborg", "Synthetic") required_candidates = 1 weight = 5 cost = 10 diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index e9a990cd8e30..07d907f2f6d5 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -168,7 +168,7 @@ antag_datum = /datum/antagonist/traitor antag_flag = ROLE_TRAITOR protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") - restricted_roles = list("Cyborg", "AI", "Positronic Brain") + restricted_roles = list("Cyborg", "AI", "Positronic Brain", "Synthetic") required_candidates = 1 weight = 7 cost = 10 @@ -563,7 +563,7 @@ antag_flag = ROLE_VAMPIRE antag_datum = /datum/antagonist/vampire protected_roles = list("Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Security Officer", "Chaplain", "Detective", "Warden", "Brig Physician") - restricted_roles = list("Cyborg", "AI") + restricted_roles = list("Cyborg", "AI", "Synthetic") required_candidates = 1 weight = 5 cost = 15 @@ -713,7 +713,7 @@ "Warden", "Security Officer", "Detective", "Brig Physician", "Curator" ) - restricted_roles = list("AI","Cyborg", "Positronic Brain") + restricted_roles = list("AI","Cyborg", "Positronic Brain", "Synthetic") required_candidates = 1 weight = 5 cost = 10 diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 90666766ad0f..d4a9188b23df 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -12,7 +12,7 @@ antag_datum = /datum/antagonist/traitor minimum_required_age = 0 protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") - restricted_roles = list("Cyborg") + restricted_roles = list("Cyborg", "Synthetic") required_candidates = 1 weight = 5 cost = 8 // Avoid raising traitor threat above 10, as it is the default low cost ruleset. @@ -53,7 +53,7 @@ antag_flag = ROLE_BROTHER antag_datum = /datum/antagonist/brother/ protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") - restricted_roles = list("AI", "Cyborg") + restricted_roles = list("AI", "Cyborg", "Synthetic") required_candidates = 2 weight = 4 cost = 10 @@ -102,7 +102,7 @@ antag_flag = ROLE_CHANGELING antag_datum = /datum/antagonist/changeling protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") - restricted_roles = list("AI", "Cyborg") + restricted_roles = list("AI", "Cyborg", "Synthetic") required_candidates = 1 weight = 3 cost = 16 @@ -140,7 +140,7 @@ antag_flag = ROLE_HERETIC antag_datum = /datum/antagonist/heretic protected_roles = list("Chaplain","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") - restricted_roles = list("AI", "Cyborg") + restricted_roles = list("AI", "Cyborg", "Synthetic") required_candidates = 1 weight = 3 cost = 15 @@ -230,7 +230,7 @@ antag_flag = ROLE_CULTIST antag_datum = /datum/antagonist/cult minimum_required_age = 14 - restricted_roles = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") + restricted_roles = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician", "Synthetic") required_candidates = 2 weight = 3 cost = 20 @@ -428,7 +428,7 @@ antag_flag = ROLE_REV_HEAD antag_datum = /datum/antagonist/rev/head minimum_required_age = 14 - restricted_roles = list("Security Officer", "Warden", "Detective", "AI", "Cyborg", "Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Shaft Miner", "Mining Medic", "Brig Physician") + restricted_roles = list("Security Officer", "Warden", "Detective", "AI", "Cyborg", "Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Shaft Miner", "Mining Medic", "Brig Physician", "Synthetic") required_candidates = 3 weight = 1 delay = 7 MINUTES @@ -577,7 +577,7 @@ antag_flag = ROLE_SERVANT_OF_RATVAR antag_datum = /datum/antagonist/clockcult protected_roles = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") - restricted_roles = list("Chaplain", "Captain") + restricted_roles = list("Chaplain", "Captain", "Synthetic") required_candidates = 4 weight = 1 cost = 40 @@ -698,7 +698,7 @@ name = "Devil" antag_flag = ROLE_DEVIL antag_datum = /datum/antagonist/devil - restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") + restricted_roles = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI", "Synthetic") required_candidates = 1 weight = 1 cost = 60 @@ -851,7 +851,7 @@ antag_flag = ROLE_SHADOWLING antag_datum = /datum/antagonist/shadowling protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") - restricted_roles = list("Cyborg", "AI") + restricted_roles = list("Cyborg", "AI", "Synthetic") required_candidates = 3 weight = 3 cost = 30 @@ -895,7 +895,7 @@ antag_flag = ROLE_VAMPIRE antag_datum = /datum/antagonist/vampire protected_roles = list("Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Security Officer", "Chaplain", "Detective", "Warden", "Brig Physician") - restricted_roles = list("Cyborg", "AI") + restricted_roles = list("Cyborg", "AI", "Synthetic") required_candidates = 3 weight = 3 cost = 8 @@ -1001,7 +1001,7 @@ antag_datum = /datum/antagonist/darkspawn/ minimum_required_age = 20 protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") - restricted_roles = list("AI", "Cyborg") + restricted_roles = list("AI", "Cyborg", "Synthetic") required_candidates = 3 weight = 3 cost = 20 @@ -1038,7 +1038,7 @@ "Warden", "Security Officer", "Detective", "Brig Physician", "Curator" ) - restricted_roles = list("AI", "Cyborg") + restricted_roles = list("AI", "Cyborg", "Synthetic") required_candidates = 1 weight = 5 cost = 10 diff --git a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm index bd857f8740e6..9bfa0c2c22a9 100644 --- a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm +++ b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm @@ -4,7 +4,7 @@ report_type = "heresy" antag_flag = ROLE_HERETIC false_report_weight = 5 - protected_jobs = list("Chaplain","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") //Yogs: Added Brig Physician + protected_jobs = list("Chaplain","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician", "Synthetic") //Yogs: Added Brig Physician restricted_jobs = list("AI", "Cyborg") required_players = 25 required_enemies = 1 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index f194b119758a..c3ff23b9892a 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -313,8 +313,8 @@ if(CONFIG_GET(flag/auto_blue_alert)) print_command_report(intercepttext, "Central Command Status Summary", announce=FALSE) priority_announce("A summary has been copied and printed to all communications consoles.\n\n[generate_station_trait_announcement()]", "Enemy communication intercepted. Security level elevated.", ANNOUNCER_INTERCEPT) - if(GLOB.security_level < SEC_LEVEL_BLUE) - set_security_level(SEC_LEVEL_BLUE) + if(SSsecurity_level.get_current_level_as_number() < SEC_LEVEL_BLUE) + SSsecurity_level.set_level(SEC_LEVEL_BLUE) else print_command_report(intercepttext, "Central Command Status Summary") diff --git a/code/game/gamemodes/hivemind/hivemind.dm b/code/game/gamemodes/hivemind/hivemind.dm index 187a92a31c26..8889e124c32f 100644 --- a/code/game/gamemodes/hivemind/hivemind.dm +++ b/code/game/gamemodes/hivemind/hivemind.dm @@ -4,7 +4,7 @@ report_type = "hivemind" antag_flag = ROLE_HIVE false_report_weight = 5 - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") //Yogs: Added "Brig Physician + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician", "Synthetic") //Yogs: Added "Brig Physician restricted_jobs = list("Cyborg","AI") required_players = 24 required_enemies = 2 diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 7c9fa59fd698..e83d8dbd2f50 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -88,19 +88,33 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event icon_state = "small" density = TRUE anchored = TRUE - var/hits = 4 - var/hitpwr = 2 //Level of ex_act to be called on hit. - var/dest pass_flags = PASSTABLE - var/heavy = 0 + + ///The resilience of our meteor + var/hits = 4 + ///Level of ex_act to be called on hit. + var/hitpwr = EXPLODE_HEAVY + //Should we shake people's screens on impact + var/heavy = FALSE + ///Sound to play when you hit something var/meteorsound = 'sound/effects/meteorimpact.ogg' + ///Our starting z level, prevents infinite meteors var/z_original - var/threat = 0 // used for determining which meteors are most interesting - var/lifetime = DEFAULT_METEOR_LIFETIME - var/timerid = null + ///Used for determining which meteors are most interesting + var/threat = 0 + + //Potential items to spawn when you die var/list/meteordrop = list(/obj/item/stack/ore/iron) + ///How much stuff to spawn when you die var/dropamt = 2 + ///The thing we're moving towards, usually a turf + var/atom/dest + ///Lifetime in seconds + var/lifetime = DEFAULT_METEOR_LIFETIME + + var/timerid = null + /obj/effect/meteor/Move() if(z != z_original || loc == dest) qdel(src) @@ -134,6 +148,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event SpinAnimation() timerid = QDEL_IN(src, lifetime) chase_target(target) + update_appearance() /obj/effect/meteor/Bump(atom/A) if(A) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 5a06527c972c..76eb7f84d647 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -124,8 +124,8 @@ l_pocket = /obj/item/pinpointer/nuke/syndicate id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol - backpack_contents = list(/obj/item/storage/box/syndie=1,\ - /obj/item/kitchen/knife/combat/survival) + box = /obj/item/storage/box/survival/syndie + backpack_contents = list(/obj/item/kitchen/knife/combat/survival) var/tc = 25 var/command_radio = FALSE @@ -174,8 +174,7 @@ internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/storage/belt/military r_hand = /obj/item/gun/ballistic/shotgun/bulldog - backpack_contents = list(/obj/item/storage/box/syndie=1,\ - /obj/item/tank/jetpack/oxygen/harness=1,\ + backpack_contents = list(/obj/item/tank/jetpack/oxygen/harness=1,\ /obj/item/gun/ballistic/automatic/pistol=1,\ /obj/item/kitchen/knife/combat/survival) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 019e35a760f1..549bc89f94a5 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -129,7 +129,7 @@ GLOBAL_LIST_EMPTY(objectives) if(O.late_joiner) try_target_late_joiners = TRUE for(var/datum/mind/possible_target in get_crewmember_minds()) - if(is_valid_target(possible_target) && !(possible_target in owners) && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target,dupe_search_range)) + if(is_valid_target(possible_target) && !(possible_target in owners) && ishuman(possible_target.current) && !is_synth(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target,dupe_search_range)) //yogs start -- Quiet Rounds var/mob/living/carbon/human/guy = possible_target.current if(possible_target.antag_datums || !(guy.mind.quiet_round)) @@ -1619,6 +1619,8 @@ GLOBAL_LIST_EMPTY(possible_items_special) continue if(!istype(get_area(machine), /area)) continue + if(istype(get_area(machine), /area/shuttle)) + continue //no whiteship machines eligible_machines |= machine eligible_machines = shuffle(eligible_machines) @@ -1650,7 +1652,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) if(machines_to_break.len == 0) return TRUE for(var/obj/machinery/thing as anything in machines_to_break) - if(thing && istype(thing, target_obj_type)) + if(thing && !QDELETED(thing) && istype(thing, target_obj_type)) return FALSE return TRUE @@ -1705,8 +1707,11 @@ GLOBAL_LIST_EMPTY(possible_items_special) var/mob/living/carbon/possible_carbon_target = possible_target.current return LAZYLEN(possible_carbon_target.internal_organs) +/datum/objective/maroon_organ/find_target(dupe_search_range, blacklist) + . = ..() + finalize() + /datum/objective/maroon_organ/finalize() - find_target() if(!target) return FALSE @@ -1730,6 +1735,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) . = ..() /datum/objective/maroon_organ/admin_edit(mob/admin) + admin_simple_target_pick(admin) finalize() update_explanation_text() return diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index bff987ecc363..063eab931e25 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -17,9 +17,9 @@ report_type = "revolution" antag_flag = ROLE_REV_HEAD false_report_weight = 10 - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg", "Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Shaft Miner", "Mining Medic", "Brig Physician") //Yogs: Added Brig Physician + restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg", "Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Shaft Miner", "Mining Medic", "Brig Physician", "Synthetic") //Yogs: Added Brig Physician required_jobs = list(list("Captain"=1),list("Head of Personnel"=1),list("Head of Security"=1),list("Chief Engineer"=1),list("Research Director"=1),list("Chief Medical Officer"=1)) //Any head present - required_players = 30 + required_players = 25 required_enemies = 2 recommended_enemies = 3 enemy_minimum_age = 14 diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index bab929203ffc..47beb70fc604 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -12,7 +12,7 @@ antag_flag = ROLE_TRAITOR false_report_weight = 20 //Reports of traitors are pretty common. restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician") //YOGS - added the hop and brig physician + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Brig Physician", "Synthetic") //YOGS - added the hop and brig physician required_players = 0 required_enemies = 1 recommended_enemies = 4 diff --git a/code/game/gamemodes/zombie/zombie.dm b/code/game/gamemodes/zombie/zombie.dm index 2c0a7df3962b..f0e21854cdd4 100644 --- a/code/game/gamemodes/zombie/zombie.dm +++ b/code/game/gamemodes/zombie/zombie.dm @@ -13,7 +13,7 @@ GLOBAL_LIST_EMPTY(zombies) antag_flag = ROLE_ZOMBIE false_report_weight = 10 restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Medical Officer", "Brig Physician") //Yogs: Added Brig Physician + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Medical Officer", "Brig Physician", "Synthetic") //Yogs: Added Brig Physician required_players = 40 required_enemies = 3 recommended_enemies = 3 diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index d89241338826..3e18adc8c563 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -90,7 +90,7 @@ return to_chat(user, span_notice("You repair [src].")) stat &= ~BROKEN - obj_integrity = max_integrity + update_integrity(max_integrity) update_appearance(UPDATE_ICON) else to_chat(user, span_notice("[src] does not need repairs.")) @@ -98,7 +98,7 @@ return ..() /obj/machinery/pdapainter/deconstruct(disassembled = TRUE) - obj_break() + atom_break() /obj/machinery/pdapainter/attack_hand(mob/user) . = ..() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 32ac40900ca3..b883f85b88be 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -468,10 +468,11 @@ Class Procs: . = new_frame new_frame.setAnchored(anchored) if(!disassembled) - new_frame.obj_integrity = (new_frame.max_integrity * 0.5) //the frame is already half broken + new_frame.update_integrity(new_frame.max_integrity * 0.5) //the frame is already half broken transfer_fingerprints_to(new_frame) -/obj/machinery/obj_break(damage_flag) +/obj/machinery/atom_break(damage_flag) + . = ..() if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) stat |= BROKEN SEND_SIGNAL(src, COMSIG_MACHINERY_BROKEN, damage_flag) @@ -613,17 +614,6 @@ Class Procs: . = ..() if(stat & BROKEN) . += span_notice("It looks broken and non-functional.") - if(!(resistance_flags & INDESTRUCTIBLE)) - if(resistance_flags & ON_FIRE) - . += span_warning("It's on fire!") - var/healthpercent = (obj_integrity/max_integrity) * 100 - switch(healthpercent) - if(50 to 99) - . += "It looks slightly damaged." - if(25 to 50) - . += "It appears heavily damaged." - if(0 to 25) - . += span_warning("It's falling apart!") if(user.research_scanner && component_parts) . += display_parts(user, TRUE) diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm index f0e9f9d19f64..2de2d046f887 100644 --- a/code/game/machinery/airlock_cycle_control.dm +++ b/code/game/machinery/airlock_cycle_control.dm @@ -789,7 +789,7 @@ playsound(src, "sparks", 50, 1) return TRUE -/obj/machinery/advanced_airlock_controller/obj_break(damage_flag) +/obj/machinery/advanced_airlock_controller/atom_break(damage_flag) ..() update_cycle_icon() @@ -798,7 +798,7 @@ new /obj/item/stack/sheet/metal(loc, 2) var/obj/item/I = new /obj/item/electronics/advanced_airlock_controller(loc) if(!disassembled) - I.obj_integrity = I.max_integrity * 0.5 + I.update_integrity(I.max_integrity * 0.5) new /obj/item/stack/cable_coil(loc, 3) qdel(src) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index d833e35e6170..f720dfdeaaa8 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) interact(user) /obj/machinery/announcement_system/proc/act_up() //does funny breakage stuff - if(!obj_break()) // if badmins flag this unbreakable or its already broken + if(!atom_break()) // if badmins flag this unbreakable or its already broken return FALSE arrival = pick("#!@%ERR-34%2 CANNOT LOCAT@# JO# F*LE!", "CRITICAL ERROR 99.", "ERR)#: DA#AB@#E NOT F(*ND!") diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 732de941f591..bb7d1ae56dbf 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/pda.dmi' icon_state = "pdapainter" density = TRUE - obj_integrity = 200 max_integrity = 200 var/obj/item/bodypart/storedpart var/initial_icon_state @@ -77,7 +76,7 @@ update_appearance(UPDATE_ICON) else if(O.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!O.tool_start_check(user, amount=0)) return @@ -90,7 +89,7 @@ return to_chat(user, span_notice("You repair [src].")) stat &= ~BROKEN - obj_integrity = max(obj_integrity, max_integrity) + update_integrity(max(atom_integrity, max_integrity)) update_appearance(UPDATE_ICON) else to_chat(user, span_notice("[src] does not need repairs.")) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 4135b3f67e81..6c2e5b0c6430 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -48,7 +48,7 @@ /obj/machinery/button/update_icon_state() . = ..() if(panel_open) - icon_state = "button-open" + icon_state = "doorctrl-open" else if(stat & (NOPOWER|BROKEN)) icon_state = "[skin]-p" @@ -75,7 +75,7 @@ /obj/machinery/button/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_SCREWDRIVER) if(panel_open || allowed(user)) - default_deconstruction_screwdriver(user, "button-open", "[skin]",W) + default_deconstruction_screwdriver(user, "doorctrl-open", "[skin]",W) update_appearance() else to_chat(user, span_danger("Maintenance Access Denied")) @@ -168,7 +168,7 @@ /obj/machinery/button/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) if(id) - id = "[port.shuttle_id]_[id]" + id = "[id]" setup_device() /obj/machinery/button/attack_hand(mob/user) @@ -335,6 +335,6 @@ /obj/item/wallframe/button name = "button frame" desc = "Used for building buttons." - icon_state = "button" + icon_state = "doorctrl" result_path = /obj/machinery/button materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b3bbb9d8025f..e3092c3429ad 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -210,7 +210,7 @@ if(!panel_open) return FALSE toggle_cam(user, 1) - obj_integrity = max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex. + update_integrity(max_integrity) //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex. I.play_tool_sound(src) return TRUE @@ -329,12 +329,12 @@ return ..() -/obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/obj/machinery/camera/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 12 && !(stat & BROKEN)) return 0 . = ..() -/obj/machinery/camera/obj_break(damage_flag) +/obj/machinery/camera/atom_break(damage_flag) if(!status) return . = ..() @@ -353,7 +353,7 @@ assembly = null else var/obj/item/I = new /obj/item/wallframe/camera (loc) - I.obj_integrity = I.max_integrity * 0.5 + I.update_integrity(I.max_integrity * 0.5) new /obj/item/stack/cable_coil(loc, 2) qdel(src) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index bf946c2be889..9a0c3e44dc81 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -138,7 +138,7 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) -/obj/machinery/computer/obj_break(damage_flag) +/obj/machinery/computer/atom_break(damage_flag) if(!circuit) //no circuit, no breaking return . = ..() @@ -151,7 +151,7 @@ if(. & EMP_PROTECT_SELF) return if(prob(5 * severity)) - obj_break(ENERGY) + atom_break(ENERGY) /obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) on_deconstruction() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 1cf5d4dc2ab6..6086a909e646 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/machinery/computer/arcade name = "random arcade" - desc = "random arcade machine" + desc = "A random arcade machine." icon_state = "arcade" icon_keyboard = null icon_screen = "invaders" diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm old mode 100755 new mode 100644 index 967cb02b766c..6bf547992542 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -54,12 +54,16 @@ /// Are we NOT a silicon, AND we're logged in as the captain? /obj/machinery/computer/communications/proc/authenticated_as_non_silicon_captain(mob/user) + if(is_synth(user)) + return FALSE if (issilicon(user)) return FALSE return ACCESS_CAPTAIN in authorize_access /// Are we a silicon, OR we're logged in as the captain? /obj/machinery/computer/communications/proc/authenticated_as_silicon_or_captain(mob/user) + if(is_synth(user)) + return FALSE if (issilicon(user)) return TRUE return ACCESS_CAPTAIN in authorize_access @@ -155,13 +159,13 @@ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return - var/new_sec_level = seclevel2num(params["newSecurityLevel"]) + var/new_sec_level = SSsecurity_level.text_level_to_number(params["newSecurityLevel"]) if (new_sec_level != SEC_LEVEL_GREEN && new_sec_level != SEC_LEVEL_BLUE) return - if (GLOB.security_level == new_sec_level) + if (SSsecurity_level.get_current_level_as_number() == new_sec_level) return - set_security_level(new_sec_level) + SSsecurity_level.set_level(new_sec_level) to_chat(usr, span_notice("Authorization confirmed. Modifying security level.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) @@ -366,16 +370,7 @@ new /obj/item/card/id/captains_spare/temporary(loc) COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) priority_announce("The emergency spare ID has been printed by [authorize_name].", "Emergency Spare ID Warning System", SSstation.announcer.get_rand_report_sound()) - if("printAIControlCode") - if(authenticated_as_non_silicon_head(usr)) - if(!COOLDOWN_FINISHED(src, important_action_cooldown)) - return - playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) - GLOB.ai_control_code = random_nukecode(6) - new /obj/item/paper/ai_control_code(loc) - COOLDOWN_START(src, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) - priority_announce("The AI Control Code been printed by [authorize_name]. All previous codes have been invalidated.", "Central Tech Support", SSstation.announcer.get_rand_report_sound()) - + /obj/machinery/computer/communications/ui_data(mob/user) var/list/data = list( @@ -410,7 +405,7 @@ data["aprilFools"] = check_holidays(APRIL_FOOLS) data["canPrintIdAndCode"] = FALSE - data["alertLevel"] = get_security_level() + data["alertLevel"] = SSsecurity_level.get_current_level_as_text() data["authorizeName"] = authorize_name data["canLogOut"] = !issilicon(user) data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac(user) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index ca384a776728..2a15624d04d2 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -119,8 +119,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/list/results = list() var/list/new_death_list = list() - var/obj/item/clothing/under/U - var/obj/item/card/id/I + var/obj/item/clothing/under/uniform + var/obj/item/card/id/idcard var/turf/pos var/ijob var/name @@ -135,159 +135,182 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/pos_y var/life_status - for(var/mob/living/carbon/human/H in GLOB.carbon_list) + for(var/mob/living/carbon/human/tracked_mob in GLOB.carbon_list) + if(is_synth(tracked_mob)) //Synths are unsupported (they're not organic) + continue + var/forced_sensors = HAS_TRAIT(tracked_mob, TRAIT_SUITLESS_SENSORS) + uniform = tracked_mob.w_uniform + pos = get_turf(tracked_mob) + + // Check if the mob has sensors at all + if(!(forced_sensors || (uniform && uniform.has_sensor > NO_SENSORS && uniform.sensor_mode > SENSOR_OFF))) + continue + + if(!pos) + stack_trace("[tracked_mob] cannot be tracked because it has no location.") + continue // you don't exist in reality + + // Machinery and the target should be on the same level or different levels of the same station + if(!(z in SSmapping.get_connected_levels(pos)) && !HAS_TRAIT(tracked_mob, TRAIT_MULTIZ_SUIT_SENSORS)) + continue + var/jammed = FALSE - var/turf/position = get_turf(H) for(var/obj/item/jammer/jammer in GLOB.active_jammers) var/turf/jammer_turf = get_turf(jammer) - if(position.z == jammer_turf.z && (get_dist(position, jammer_turf) <= jammer.range)) + if(pos.z == jammer_turf.z && (get_dist(pos, jammer_turf) <= jammer.range)) jammed = TRUE break if(jammed) // radio jammers prevent suit sensors continue - var/nanite_sensors = FALSE - if(H in SSnanites.nanite_monitored_mobs) - nanite_sensors = TRUE - // Check if their z-level is correct and if they are wearing a uniform. - // Accept H.z==0 as well in case the mob is inside an object. - if ((H.z == 0 || H.z == z) && (istype(H.w_uniform, /obj/item/clothing/under) || nanite_sensors)) - U = H.w_uniform - - // Are the suit sensors on? - if (nanite_sensors || ((U.has_sensor > 0) && U.sensor_mode)) - pos = H.z == 0 || (nanite_sensors || U.sensor_mode == SENSOR_COORDS) ? get_turf(H) : null - - // Special case: If the mob is inside an object confirm the z-level on turf level. - if (H.z == 0 && (!pos || (pos.z != z) && !(is_station_level(pos.z) && is_station_level(z)))) - continue - - I = H.wear_id ? H.wear_id.GetID() : null - - var/species - var/is_irradiated = FALSE - var/is_wounded = FALSE - var/is_husked = FALSE - var/is_onfire = FALSE - var/is_bonecrack = FALSE - var/is_disabled = FALSE - var/no_warnings = FALSE - - if (I) - name = I.registered_name - assignment_title = I.assignment - assignment = I.originalassignment - ijob = jobs[I.originalassignment] - else - name = "Unknown" - assignment_title = "" - assignment = "" - ijob = 80 + idcard = tracked_mob.wear_id ? tracked_mob.wear_id.GetID() : null + + var/species + var/is_irradiated = FALSE + var/is_wounded = FALSE + var/is_husked = FALSE + var/is_onfire = FALSE + var/is_bonecrack = FALSE + var/is_disabled = FALSE + var/no_warnings = FALSE + + if (idcard) + name = idcard.registered_name + assignment_title = idcard.assignment + assignment = idcard.originalassignment + ijob = jobs[idcard.originalassignment] + else + name = "Unknown" + assignment_title = "" + assignment = "" + ijob = 80 - if (nanite_sensors || U.sensor_mode >= SENSOR_LIVING) - life_status = H.stat < DEAD - else - life_status = null - - if (nanite_sensors || U.sensor_mode >= SENSOR_VITALS) - oxydam = round(H.getOxyLoss(),1) - toxdam = round(H.getToxLoss(),1) - burndam = round(H.getFireLoss(),1) - brutedam = round(H.getBruteLoss(),1) - - //species check - if (ishumanbasic(H)) - species = "Human" - if (ispreternis(H)) - species = "Robot" - if (isipc(H)) - species = "IPC" - if (ispodperson(H)) - species = "Podperson" - if (islizard(H)) - species = "Lizard" - if (isplasmaman(H)) - species = "Plasmaman" - if (ispolysmorph(H)) - species = "Polysmorph" - if (ismoth(H)) - species = "Moth" - if (isflyperson(H)) - species = "Fly" - if (iscatperson(H)) - species = "Felinid" - if (isskeleton(H)) - species = "Skeleton" - if (isjellyperson(H)) - species = "Slime" - if (isethereal(H)) - species = "Ethereal" - if (iszombie(H)) - species = "Zombie" - if (issnail(H)) - species = "Snail" - if (isabductor(H)) - species = "Alien" - if (isandroid(H)) - species = "Android" - - for(var/obj/item/bodypart/part in H.bodyparts) - if(part.bodypart_disabled == TRUE) //check if has disabled limbs - is_disabled = TRUE - if(locate(/obj/item) in part.embedded_objects) //check if has embed objects - is_wounded = TRUE - if(length(H.get_missing_limbs())) //check if has missing limbs - is_disabled = TRUE + if (forced_sensors || uniform.sensor_mode >= SENSOR_LIVING) + life_status = tracked_mob.stat < DEAD + else + life_status = null + + if (forced_sensors || uniform.sensor_mode >= SENSOR_VITALS) + oxydam = round(tracked_mob.getOxyLoss(),1) + toxdam = round(tracked_mob.getToxLoss(),1) + burndam = round(tracked_mob.getFireLoss(),1) + brutedam = round(tracked_mob.getBruteLoss(),1) + + //species check + if (ishumanbasic(tracked_mob)) + species = "Human" + if (ispreternis(tracked_mob)) + species = "Robot" + if (isipc(tracked_mob)) + species = "IPC" + if (ispodperson(tracked_mob)) + species = "Podperson" + if (islizard(tracked_mob)) + species = "Lizard" + if (isplasmaman(tracked_mob)) + species = "Plasmaman" + if (ispolysmorph(tracked_mob)) + species = "Polysmorph" + if (ismoth(tracked_mob)) + species = "Moth" + if (isflyperson(tracked_mob)) + species = "Fly" + if (iscatperson(tracked_mob)) + species = "Felinid" + if (isskeleton(tracked_mob)) + species = "Skeleton" + if (isjellyperson(tracked_mob)) + species = "Slime" + if (isethereal(tracked_mob)) + species = "Ethereal" + if (iszombie(tracked_mob)) + species = "Zombie" + if (issnail(tracked_mob)) + species = "Snail" + if (isabductor(tracked_mob)) + species = "Alien" + if (isandroid(tracked_mob)) + species = "Android" + + for(var/obj/item/bodypart/part in tracked_mob.bodyparts) + if(part.bodypart_disabled == TRUE) //check if has disabled limbs + is_disabled = TRUE + if(locate(/obj/item) in part.embedded_objects) //check if has embed objects + is_wounded = TRUE + if(length(tracked_mob.get_missing_limbs())) //check if has missing limbs + is_disabled = TRUE - //check if has generic wounds except for bone one - if(locate(/datum/wound/slash) in H.all_wounds) - is_wounded = TRUE - if(locate(/datum/wound/pierce) in H.all_wounds) - is_wounded = TRUE - if(locate(/datum/wound/slash) in H.all_wounds) - is_wounded = TRUE - if(locate(/datum/wound/burn) in H.all_wounds) - is_wounded = TRUE - - if(locate(/datum/wound/blunt) in H.all_wounds) //check if has bone wounds - is_bonecrack = TRUE + //check if has generic wounds except for bone one + if(locate(/datum/wound/slash) in tracked_mob.all_wounds) + is_wounded = TRUE + if(locate(/datum/wound/pierce) in tracked_mob.all_wounds) + is_wounded = TRUE + if(locate(/datum/wound/slash) in tracked_mob.all_wounds) + is_wounded = TRUE + if(locate(/datum/wound/burn) in tracked_mob.all_wounds) + is_wounded = TRUE + + if(locate(/datum/wound/blunt) in tracked_mob.all_wounds) //check if has bone wounds + is_bonecrack = TRUE - if(H.radiation > RAD_MOB_SAFE) //safe level before sending alert - is_irradiated = TRUE - - if(HAS_TRAIT(H, TRAIT_HUSK)) //check if husked - is_husked = TRUE - species = null //suit sensors won't recognize anymore - - if(H.on_fire == TRUE) //check if on fire - is_onfire = TRUE - - //warnings checks - if(is_wounded || is_onfire || is_irradiated || is_husked || is_disabled || is_bonecrack) - no_warnings = TRUE - - else - oxydam = null - toxdam = null - burndam = null - brutedam = null - species = null - - if (nanite_sensors || U.sensor_mode >= SENSOR_COORDS) - if (!pos) - pos = get_turf(H) - area = get_area_name(H, TRUE, is_sensor = TRUE) - pos_x = pos.x - pos_y = pos.y - else - area = null - pos_x = null - pos_y = null - - if(life_status == FALSE) - new_death_list.Add(H) - - results[++results.len] = list("name" = name, "assignment_title" = assignment_title, "assignment" = assignment, "ijob" = ijob, "is_wounded" = is_wounded, "no_warnings" = no_warnings, "is_onfire" = is_onfire, "is_husked" = is_husked, "is_bonecrack" = is_bonecrack, "is_disabled" = is_disabled, "is_irradiated" = is_irradiated, "species" = species, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null)) + if(tracked_mob.radiation > RAD_MOB_SAFE) //safe level before sending alert + is_irradiated = TRUE + + if(HAS_TRAIT(tracked_mob, TRAIT_HUSK)) //check if husked + is_husked = TRUE + species = null //suit sensors won't recognize anymore + + if(tracked_mob.on_fire == TRUE) //check if on fire + is_onfire = TRUE + + //warnings checks + if(is_wounded || is_onfire || is_irradiated || is_husked || is_disabled || is_bonecrack) + no_warnings = TRUE + + else + oxydam = null + toxdam = null + burndam = null + brutedam = null + species = null + + if (forced_sensors || uniform.sensor_mode >= SENSOR_COORDS) + if (!pos) + pos = get_turf(tracked_mob) + area = get_area_name(tracked_mob, TRUE, is_sensor = TRUE) + pos_x = pos.x + pos_y = pos.y + else + area = null + pos_x = null + pos_y = null + + if(life_status == FALSE) + new_death_list.Add(tracked_mob) + + results[++results.len] = list( + "name" = name, + "assignment_title" = assignment_title, + "assignment" = assignment, + "ijob" = ijob, + "is_wounded" = is_wounded, + "no_warnings" = no_warnings, + "is_onfire" = is_onfire, + "is_husked" = is_husked, + "is_bonecrack" = is_bonecrack, + "is_disabled" = is_disabled, + "is_irradiated" = is_irradiated, + "species" = species, + "life_status" = life_status, + "oxydam" = oxydam, + "toxdam" = toxdam, + "burndam" = burndam, + "brutedam" = brutedam, + "area" = area, + "pos_x" = pos_x, + "pos_y" = pos_y, + "can_track" = tracked_mob.can_track(null) + ) data_by_z["[z]"] = sortTim(results,/proc/sensor_compare) last_update["[z]"] = world.time diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index bd642b99f661..89a6cb203103 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -72,44 +72,7 @@ data["logged_in"] = logged_in - if(issilicon(user)) - var/mob/living/silicon/borg = user - data["username"] = borg.name - data["has_access"] = TRUE - - if(IsAdminGhost(user)) - data["username"] = user.client.holder.admin_signature - data["has_access"] = TRUE - - if(ishuman(user)) - var/username = user.get_authentification_name("Unknown") - data["username"] = user.get_authentification_name("Unknown") - if(username != "Unknown") - var/datum/data/record/record - for(var/RP in GLOB.data_core.general) - var/datum/data/record/R = RP - - if(!istype(R)) - continue - if(R.fields["name"] == username) - record = R - break - if(record) - if(istype(record.fields["photo_front"], /obj/item/photo)) - var/obj/item/photo/P1 = record.fields["photo_front"] - var/icon/picture = icon(P1.picture.picture_image) - picture.Crop(10, 32, 22, 22) - var/md5 = md5(fcopy_rsc(picture)) - - if(!SSassets.cache["photo_[md5]_cropped.png"]) - SSassets.transport.register_asset("photo_[md5]_cropped.png", picture) - SSassets.transport.send_assets(user, list("photo_[md5]_cropped.png" = picture)) - - data["user_image"] = SSassets.transport.get_asset_url("photo_[md5]_cropped.png") - - data["has_access"] = check_access(user.get_idcard()) - - + data += tgui_login_data(user, src) if(!logged_in) return data @@ -277,7 +240,6 @@ data["active_record"] = record - return data /obj/machinery/computer/secure_data/ui_static_data(mob/user) @@ -292,6 +254,8 @@ if(..()) return + + switch(action) if("back") if(!logged_in) @@ -305,6 +269,10 @@ active_security_record = null screen = MAIN_SCREEN + logged_in = tgui_login_act(usr, src) + if(!logged_in) + return + if(issilicon(usr)) var/mob/living/silicon/borg = usr logged_in = borg.name @@ -314,17 +282,14 @@ if(IsAdminGhost(usr)) logged_in = usr.client.holder.admin_signature rank = "Central Command Officer" - - - - - var/mob/living/carbon/human/H = usr - if(!istype(H)) return - if(check_access(H.get_idcard())) + var/mob/living/carbon/human/H = usr + if(istype(H)) logged_in = H.get_authentification_name("Unknown") rank = H.get_assignment("Unknown", "Unknown") + return + if("log_out") if(!logged_in) return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 996a0decb188..4d568e0a8eff 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -134,8 +134,6 @@ GLOBAL_LIST_EMPTY(cryopod_computers) updateUsrDialog() return -GLOBAL_VAR_INIT(cryopods_enabled, FALSE) - //Cryopods themselves. /obj/machinery/cryopod name = "cryogenic freezer" @@ -168,6 +166,7 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE) /obj/machinery/cryopod/Initialize(mapload) ..() GLOB.cryopods += src + RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(update_security_level)) return INITIALIZE_HINT_LATELOAD //Gotta populate the cryopod computer GLOB first /obj/machinery/cryopod/Destroy() @@ -178,6 +177,12 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE) update_appearance(UPDATE_ICON) find_control_computer() +/obj/machinery/cryopod/proc/update_security_level(_, datum/security_level/new_level) + if(new_level.allow_cryo) + PowerOn() + else + PowerOff() + /obj/machinery/cryopod/proc/PowerOn() if(!occupant) open_machine() @@ -232,7 +237,7 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE) /obj/machinery/cryopod/open_machine() ..() - icon_state = GLOB.cryopods_enabled ? "cryopod-open" : "cryopod-off" + icon_state = SSsecurity_level.current_security_level.allow_cryo ? "cryopod-open" : "cryopod-off" if(open_sound) playsound(src, open_sound, 40) density = TRUE @@ -378,7 +383,7 @@ GLOBAL_VAR_INIT(cryopods_enabled, FALSE) if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled) return - if(!GLOB.cryopods_enabled) + if(!SSsecurity_level.current_security_level.allow_cryo) to_chat(user, span_boldnotice("Nanotrasen does not allow abandoning your crew during a crisis. Cryo systems disabled until the current crisis is resolved.")) return diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 63a7a47cf142..079a930be5f2 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -27,7 +27,7 @@ . = ..() if(defib) . += "There is a defib unit hooked up. Alt-click to remove it." - if(GLOB.security_level >= SEC_LEVEL_RED) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) . += span_notice("Due to a security situation, its locking clamps can be toggled by swiping any ID.") else . += span_notice("Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.") @@ -83,7 +83,7 @@ return var/obj/item/card/id = I.GetID() if(id) - if(check_access(id) || GLOB.security_level >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert! + if(check_access(id) || SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) //anyone can toggle the clamps in red alert! if(!defib) to_chat(user, span_warning("You can't engage the clamps on a defibrillator that isn't there.")) return diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 1875ad8524df..10536513fd65 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -28,13 +28,13 @@ /obj/structure/barricade/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM && bar_material == METAL) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return to_chat(user, span_notice("You begin repairing [src]...")) if(I.use_tool(src, user, 40, volume=40)) - obj_integrity = clamp(obj_integrity + 20, 0, max_integrity) + update_integrity(clamp(atom_integrity + 20, 0, max_integrity)) else return ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 4b17d6bd8892..86efd3423d60 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -172,11 +172,7 @@ if(glass) airlock_material = "glass" if(security_level > AIRLOCK_SECURITY_METAL) - obj_integrity = normal_integrity * AIRLOCK_INTEGRITY_MULTIPLIER - max_integrity = normal_integrity * AIRLOCK_INTEGRITY_MULTIPLIER - else - obj_integrity = normal_integrity - max_integrity = normal_integrity + modify_max_integrity(normal_integrity * AIRLOCK_INTEGRITY_MULTIPLIER) if(damage_deflection == AIRLOCK_DAMAGE_DEFLECTION_N && security_level > AIRLOCK_SECURITY_METAL) damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_R prepare_huds() @@ -193,7 +189,7 @@ if(id_tag) id_tag = "[port.shuttle_id]_[id_tag]" -/obj/machinery/door/airlock/obj_break(damage_flag) +/obj/machinery/door/airlock/atom_break(damage_flag) . = ..() if(!.) return FALSE @@ -513,7 +509,7 @@ else return else if(user.has_status_effect(/datum/status_effect/hallucination) && ishuman(user) && prob(1) && !operating) - if(user.getarmor(user.held_index_to_body_zone(user.active_hand_index), ELECTRIC) < 100) + if(user.getarmor(user.held_index_to_hand(user.active_hand_index), ELECTRIC) < 100) new /datum/hallucination/shock(user) return var/allowed = (obj_flags & CMAGGED) ? cmag_allowed(user) : allowed(user) @@ -711,9 +707,9 @@ SSvis_overlays.add_vis_overlay(src, overlays_file, "lights_emergency", FLOAT_LAYER, FLOAT_PLANE, dir) if(welded) SSvis_overlays.add_vis_overlay(src, overlays_file, "welded", FLOAT_LAYER, FLOAT_PLANE, dir) - if(obj_integrity You loudly begin smashing down [src].") - while(obj_integrity > max_integrity * 0.25) + while(atom_integrity > max_integrity * 0.25) if(T.twin) if(!do_after(user, rand(4, 6), src)) T.darkspawn.use_psi(30) @@ -1251,14 +1253,14 @@ span_notice("You [welded ? "weld the airlock shut":"unweld the airlock"].")) update_appearance(UPDATE_ICON) else - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!W.tool_start_check(user, amount=0)) return user.visible_message("[user] is welding the airlock.", \ span_notice("You begin repairing the airlock..."), \ span_italics("You hear welding.")) if(W.use_tool(src, user, 40, volume=50, extra_checks = CALLBACK(src, PROC_REF(weld_checks), W, user))) - obj_integrity = max_integrity + update_integrity(max_integrity) stat &= ~BROKEN user.visible_message("[user.name] has repaired [src].", \ span_notice("You finish repairing the airlock.")) @@ -1306,10 +1308,9 @@ return INVOKE_ASYNC(src, (density ? PROC_REF(open) : PROC_REF(close)), 2) - if(istype(I, /obj/item/jawsoflife) || istype(I, /obj/item/mantis/blade)) - if(isElectrified()) - if(shock(user,100))//it's like sticking a fork in a power socket - return + if(istype(I, /obj/item/jawsoflife) || istype(I, /obj/item/mantis/blade) || istype(I, /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp)) + if(isElectrified() && shock(user,100))//it's like sticking a fork in a power socket + return if(istype(I, /obj/item/mantis/blade)) var/obj/item/mantis/blade/secondsword = user.get_inactive_held_item() @@ -1575,6 +1576,14 @@ if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!")) + +/obj/machinery/door/airlock/proc/safe_lockdown() + // Must be powered and have working AI wire. + if(canAIControl(src) && !stat) + locked = FALSE //For airlocks that were bolted open. + close() + bolt() //Bolt it! + /obj/machinery/door/airlock/hostile_lockdown(mob/origin) // Must be powered and have working AI wire. if(canAIControl(src) && !stat) @@ -1595,6 +1604,13 @@ open() safe = TRUE +/obj/machinery/door/airlock/proc/disable_safe_lockdown() + // Must be powered and have working AI wire. + if(canAIControl(src) && !stat) + unbolt() + open() + + /obj/machinery/door/airlock/proc/set_electrified(seconds, mob/user) secondsElectrified = seconds diag_hud_set_electrified() @@ -1616,7 +1632,7 @@ /obj/machinery/door/airlock/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - if(obj_integrity < (0.75 * max_integrity)) + if(atom_integrity < (0.75 * max_integrity)) update_appearance(UPDATE_ICON) @@ -1638,7 +1654,7 @@ if(!disassembled) if(A) - A.obj_integrity = A.max_integrity * 0.5 + A.update_integrity(A.max_integrity * 0.5) else if(obj_flags & EMAGGED) if(user) to_chat(user, span_warning("You discard the damaged electronics.")) @@ -1662,7 +1678,7 @@ qdel(src) /obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_DECONSTRUCT) if(security_level != AIRLOCK_SECURITY_NONE) to_chat(user, span_notice("[src]'s reinforcement needs to be removed first.")) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 7bf3fefe4449..679557a011e8 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -3,9 +3,14 @@ req_access = list(ACCESS_MAINT_TUNNELS) custom_price = 5 + /// A list of all granded accesses var/list/accesses = list() + /// If the airlock should require ALL or only ONE of the listed accesses var/one_access = 0 - var/unres_sides = 0 //unrestricted sides, or sides of the airlock that will open regardless of access + /// Unrestricted sides, or sides of the airlock that will open regardless of access + var/unres_sides = 0 + /// A holder of the electronics, in case of them working as an integrated part + var/holder /obj/item/electronics/airlock/examine(mob/user) . = ..() @@ -49,40 +54,45 @@ return data -/obj/item/electronics/airlock/ui_act(action, params) - if(..()) - return +/// Shared by RCD and airlock electronics +/obj/item/electronics/airlock/proc/do_action(action, params) switch(action) if("clear_all") accesses = list() one_access = 0 - . = TRUE if("grant_all") accesses = get_all_accesses() - . = TRUE if("one_access") one_access = !one_access - . = TRUE if("set") var/access = text2num(params["access"]) if (!(access in accesses)) accesses += access else accesses -= access - . = TRUE if("direc_set") var/unres_direction = text2num(params["unres_direction"]) unres_sides ^= unres_direction //XOR, toggles only the bit that was clicked - . = TRUE if("grant_region") var/region = text2num(params["region"]) if(isnull(region)) return accesses |= get_region_accesses(region) - . = TRUE if("deny_region") var/region = text2num(params["region"]) if(isnull(region)) return accesses -= get_region_accesses(region) - . = TRUE + +/obj/item/electronics/airlock/ui_act(action, params) + . = ..() + if(.) + return + + do_action(action, params) + return TRUE + +/obj/item/electronics/airlock/ui_host() + if(holder) + return holder + return src diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 4607882135b0..eaa6c55bb6b3 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -615,9 +615,6 @@ /obj/machinery/door/airlock/clockwork/hasPower() return TRUE //yes we do have power -/obj/machinery/door/airlock/clockwork/obj_break(damage_flag) - return - /obj/machinery/door/airlock/clockwork/deconstruct(disassembled = TRUE) playsound(src, 'sound/items/deconstruct.ogg', 50, 1) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 83cf0ff55639..fe12396a1ff7 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -101,7 +101,7 @@ targets += C if(!targets.len) - obj_break() + atom_break() update_appearance(UPDATE_ICON) /obj/machinery/door_timer/attackby(obj/item/W, mob/user, params) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index c1bc607cfe89..77988134caf9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -63,10 +63,10 @@ /obj/machinery/door/examine(mob/user) . = ..() if(red_alert_access) - if(GLOB.security_level >= SEC_LEVEL_RED) + if(SSsecurity_level.current_security_level.emergency_doors) . += span_notice("Due to a security threat, its access requirements have been lifted!") else - . += span_notice("In the event of a red alert, its access requirements will automatically lift.") + . += span_notice("In the event of an emegerency alert, its access requirements will automatically lift.") if(!poddoor) . += span_notice("Its maintenance panel is screwed in place.") if(!isdead(user)) @@ -76,7 +76,7 @@ . += span_notice("It leads into [areaName].") /obj/machinery/door/check_access_list(list/access_list) - if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED) + if(red_alert_access && SSsecurity_level.current_security_level.emergency_doors) return TRUE return ..() @@ -97,6 +97,13 @@ COMSIG_ATOM_MAGICALLY_UNLOCKED = PROC_REF(on_magic_unlock), ) AddElement(/datum/element/connect_loc, loc_connections) + if(red_alert_access) + RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(update_security_level)) + +/obj/machinery/door/proc/update_security_level(_, datum/security_level/new_level) + if(red_alert_access && new_level.emergency_doors) + visible_message(span_notice("[src] whirrs as it automatically lifts access requirements!")) + playsound(src, 'sound/machines/boltsup.ogg', 50, TRUE) /obj/machinery/door/proc/set_init_door_layer() if(density) @@ -297,7 +304,7 @@ /obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - if(. && obj_integrity > 0) + if(. && atom_integrity > 0) if(damage_amount >= 10 && prob(30)) spark_system.start() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 19df2d845817..c21f917ef52e 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -506,7 +506,7 @@ icon_state = "frame[constructionStep]" /obj/structure/firelock_frame/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_DECONSTRUCT) + if(the_rcd.construction_mode == RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) return FALSE diff --git a/code/game/machinery/doors/ministile.dm b/code/game/machinery/doors/ministile.dm index be54ffec9e12..80aff50254f2 100644 --- a/code/game/machinery/doors/ministile.dm +++ b/code/game/machinery/doors/ministile.dm @@ -5,7 +5,6 @@ icon_state = "ministile_map" power_channel = AREA_USAGE_ENVIRON density = TRUE - obj_integrity = 150 max_integrity = 150 //Smaller turnstile easier to smash armor = list(MELEE = 30, BULLET = 20, LASER = 0, ENERGY = 60, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 50) diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index d91a9c9cfd38..29e5deab4a64 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -16,6 +16,55 @@ /obj/machinery/door/password/voice voice_activated = TRUE +/obj/machinery/door/password/floppy_disk + desc = "This door only opens when provided with a decrypted floppy drive." + var/id + +/obj/machinery/door/password/floppy_disk/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I, /obj/item/disk/puzzle)) + var/obj/item/disk/puzzle/P = I + if(P.id == id) + if(P.decrypted) + open() + to_chat(user, span_notice("You insert [P].")) + qdel(P) + else + to_chat(user, span_warning("This disk doesn't seem to have been decrypted!")) + else + to_chat(user, span_warning("This disk doesn't belong to this door!")) + +/obj/machinery/door/password/floppy_disk/try_to_activate_door(mob/user) + add_fingerprint(user) + if(operating) + return + if(density) + do_animate("deny") + +/obj/machinery/door/password/button_puzzle + desc = "This door has no obvious way to be opened." + var/id + +/obj/machinery/door/password/button_puzzle/Initialize(mapload) + . = ..() + for(var/datum/button_puzzle_holder/H in GLOB.button_puzzles) + if(H.id == id) + H.doors += src + var/datum/button_puzzle_holder/H = new() + H.id = id + H.doors += src + GLOB.button_puzzles += H + +/obj/machinery/door/password/button_puzzle/attackby(obj/item/I, mob/user, params) + . = ..() + to_chat(user, span_warning("You're not sure how to open this door! Maybe look around?")) + +/obj/machinery/door/password/button_puzzle/try_to_activate_door(mob/user) + add_fingerprint(user) + if(operating) + return + if(density) + do_animate("deny") /obj/machinery/door/password/Initialize(mapload) . = ..() @@ -26,6 +75,8 @@ . = ..() if(!density || !voice_activated || radio_freq) return + if(!ishuman(speaker)) + return if(findtext(raw_message,password)) open() diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 3b0f1ee6782e..7dca32d1cfd4 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -189,4 +189,4 @@ . += " start_at) - processing = TRUE - soundloop.start() - update_appearance(UPDATE_ICON) - set_light(2, 1, "#ff0000") - else + if(!(C.mob_biotypes & MOB_ORGANIC)) + say("Subject does not contain fat.") + playsound(src, 'sound/machines/buzz-sigh.ogg', 40, FALSE) + overlays += "[icon_state]_red" //throw a red light icon over it, to show that it wont work + return + + if(C.nutrition < start_at) say("Subject not fat enough.") playsound(src, 'sound/machines/buzz-sigh.ogg', 40, FALSE) overlays += "[icon_state]_red" //throw a red light icon over it, to show that it wont work + return + + START_PROCESSING(SSmachines, src) + soundloop.start() + update_appearance(UPDATE_ICON) + set_light(2, 1, "#ff0000") /obj/machinery/fat_sucker/proc/stop() - processing = FALSE soundloop.stop() set_light(0, 0) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index d946d60f8ffc..6eb2d5b65405 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -66,6 +66,8 @@ radio.recalculateChannels() STOP_PROCESSING(SSmachines, src) // I will do this + RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(update_security_level)) + /obj/machinery/firealarm/Destroy() myarea.firereset(src, TRUE) QDEL_NULL(radio) @@ -82,15 +84,19 @@ return icon_state = "fire0" +/obj/machinery/firealarm/proc/update_security_level() + if(is_station_level(z)) + update_appearance(UPDATE_OVERLAYS) + /obj/machinery/firealarm/update_overlays() . = ..() if(stat & (NOPOWER|BROKEN)) return if(is_station_level(z)) - var/current_level = GLOB.security_level - . += mutable_appearance(icon, "fire_[GLOB.security_level]") - . += emissive_appearance(icon, "fire_[GLOB.security_level]", src) + var/current_level = SSsecurity_level.get_current_level_as_number() + . += mutable_appearance(icon, "fire_[current_level]") + . += emissive_appearance(icon, "fire_[current_level]", src) switch(current_level) if(SEC_LEVEL_GREEN) set_light(l_color = LIGHT_COLOR_BLUEGREEN) @@ -218,13 +224,13 @@ if(panel_open) if(W.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!W.tool_start_check(user, amount=0)) return to_chat(user, span_notice("You begin repairing [src]...")) if(W.use_tool(src, user, 40, volume=50)) - obj_integrity = max_integrity + update_integrity(max_integrity) to_chat(user, span_notice("You repair [src].")) else to_chat(user, span_warning("[src] is already in good condition!")) @@ -328,7 +334,7 @@ /obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(.) //damage received - if(obj_integrity > 0 && !(stat & BROKEN) && buildstage != 0) + if(atom_integrity > 0 && !(stat & BROKEN) && buildstage != 0) if(prob(33)) alarm() @@ -337,7 +343,7 @@ deconstruct() ..() -/obj/machinery/firealarm/obj_break(damage_flag) +/obj/machinery/firealarm/atom_break(damage_flag) if(buildstage == 0) //can't break the electronics if there isn't any inside. return @@ -352,7 +358,7 @@ if(!(stat & BROKEN)) var/obj/item/I = new /obj/item/electronics/firealarm(loc) if(!disassembled) - I.obj_integrity = I.max_integrity * 0.5 + I.update_integrity(I.max_integrity * 0.5) new /obj/item/stack/cable_coil(loc, 3) qdel(src) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index e121be5be390..1aa4eacedded 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -94,7 +94,7 @@ if (anchored) return flash() -/obj/machinery/flasher/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/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 . = ..() @@ -146,7 +146,7 @@ bulb.burn_out() power_change() -/obj/machinery/flasher/obj_break(damage_flag) +/obj/machinery/flasher/atom_break(damage_flag) . = ..() if(. && bulb) bulb.burn_out() diff --git a/code/game/machinery/harvester.dm b/code/game/machinery/harvester.dm index 427f4ff9de99..e12e4d8180de 100644 --- a/code/game/machinery/harvester.dm +++ b/code/game/machinery/harvester.dm @@ -112,7 +112,8 @@ BP.drop_organs() else for(var/obj/item/organ/O in BP.dismember()) - O.forceMove(target) //Some organs, like chest ones, are different so we need to manually move them + if(O.can_extract()) + O.forceMove(target) //Some organs, like chest ones, are different so we need to manually move them operation_order.Remove(BP) break use_power(5000) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index b2c281582d78..2df3aadcc8a4 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -122,6 +122,19 @@ obj/machinery/holopad/secure/Initialize(mapload) else if(disk && disk.record) replay_start() +/obj/machinery/holopad/tutorial/attackby(obj/item/P, mob/user, params) + . = ..() + if(istype(P, /obj/item/crowbar)) + if(disk) + disk.forceMove(drop_location()) + disk = null + return TRUE + +/obj/machinery/holopad/tutorial/examine(mob/user) + . = ..() + . += span_notice("Use a crowbar to remove an already inserted disk.") + + /obj/machinery/holopad/tutorial/HasProximity(atom/movable/AM) if (!isliving(AM)) return @@ -167,7 +180,7 @@ obj/machinery/holopad/secure/Initialize(mapload) if(outgoing_call) outgoing_call.ConnectionFailure(src) -/obj/machinery/holopad/obj_break() +/obj/machinery/holopad/atom_break() . = ..() if(outgoing_call) outgoing_call.ConnectionFailure(src) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 9e61e8634e17..4d94c08c4a52 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -91,14 +91,6 @@ return INITIALIZE_HINT_LATELOAD return INITIALIZE_HINT_NORMAL -/obj/machinery/light_switch/LateInitialize() - if(!is_station_level(z)) - return - var/area/source_area = get_area(get_turf(src)) - if(source_area.lights_always_start_on) - return - turn_off() - /obj/machinery/light_switch/update_appearance(updates=ALL) . = ..() luminosity = (stat & NOPOWER) ? 0 : 1 diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index b7f37a366fe2..b73dc93aeffb 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -238,7 +238,7 @@ GLOBAL_LIST_EMPTY(allCasters) /obj/machinery/newscaster/update_overlays() . = ..() - var/hp_percent = obj_integrity * 100 /max_integrity + var/hp_percent = atom_integrity * 100 /max_integrity switch(hp_percent) if(75 to 100) return @@ -735,7 +735,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(!(stat & BROKEN)) return to_chat(user, span_notice("You repair [src].")) - obj_integrity = max_integrity + update_integrity(max_integrity) stat &= ~BROKEN update_appearance(UPDATE_ICON) else @@ -761,7 +761,7 @@ GLOBAL_LIST_EMPTY(allCasters) new /obj/item/shard(loc) qdel(src) -/obj/machinery/newscaster/obj_break(damage_flag) +/obj/machinery/newscaster/atom_break(damage_flag) . = ..() if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 466411473c78..c767434178a4 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -315,7 +315,7 @@ /obj/machinery/porta_turret/take_damage(ddamage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - if(. && obj_integrity > 0) //damage received + if(. && atom_integrity > 0) //damage received if(prob(30)) spark_system.start() if(on && !attacked && !(obj_flags & EMAGGED)) @@ -328,7 +328,7 @@ /obj/machinery/porta_turret/deconstruct(disassembled = TRUE) qdel(src) -/obj/machinery/porta_turret/obj_break(damage_flag) +/obj/machinery/porta_turret/atom_break(damage_flag) . = ..() if(.) power_change() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 053172a63740..1c04a95992a0 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -117,7 +117,7 @@ /obj/machinery/shieldgen/deconstruct(disassembled = TRUE) - obj_break() + atom_break() locked = pick(0,1) /obj/machinery/shieldgen/interact(mob/user) @@ -164,7 +164,7 @@ if(coil.get_amount() < 1) return coil.use(1) - obj_integrity = max_integrity + update_integrity(max_integrity) stat &= ~BROKEN to_chat(user, span_notice("You repair \the [src].")) update_appearance(UPDATE_ICON) diff --git a/code/game/machinery/shuttle/custom_shuttle.dm b/code/game/machinery/shuttle/custom_shuttle.dm index 9bf721b80c83..9e57eb46b10e 100644 --- a/code/game/machinery/shuttle/custom_shuttle.dm +++ b/code/game/machinery/shuttle/custom_shuttle.dm @@ -2,7 +2,6 @@ name = "shuttle component" desc = "Something for shuttles." density = TRUE - obj_integrity = 250 max_integrity = 250 icon = 'icons/turf/shuttle.dmi' icon_state = "burst_plasma" diff --git a/code/game/machinery/shuttle/shuttle_engine.dm b/code/game/machinery/shuttle/shuttle_engine.dm index de4c97a5f9fa..4ced50ddff37 100644 --- a/code/game/machinery/shuttle/shuttle_engine.dm +++ b/code/game/machinery/shuttle/shuttle_engine.dm @@ -9,7 +9,6 @@ name = "shuttle thruster" desc = "A thruster for shuttles." density = TRUE - obj_integrity = 250 max_integrity = 250 icon = 'icons/turf/shuttle.dmi' icon_state = "burst_plasma" diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index f5d357885ada..783aab503e76 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -151,7 +151,7 @@ SET_PLANE(mattress_on, PLANE_TO_TRUE(mattress_on.plane), new_turf) return ..() -/obj/machinery/stasis/obj_break(damage_flag) +/obj/machinery/stasis/atom_break(damage_flag) . = ..() if(.) play_power_sound() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 3bd5a4d73720..7eca004e51ec 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -42,11 +42,11 @@ if(!try_detonate()) ..() -/obj/machinery/syndicatebomb/obj_break() +/obj/machinery/syndicatebomb/atom_break() if(!try_detonate()) ..() -/obj/machinery/syndicatebomb/obj_destruction() +/obj/machinery/syndicatebomb/atom_destruction() if(!try_detonate()) ..() @@ -173,9 +173,9 @@ new /obj/item/stack/sheet/plasteel( loc, 5) qdel(src) else - var/old_integ = obj_integrity + var/old_integ = atom_integrity . = ..() - if((old_integ > obj_integrity) && active && (payload in src)) + if((old_integ > atom_integrity) && active && (payload in src)) to_chat(user, span_warning("That seems like a really bad idea...")) /obj/machinery/syndicatebomb/interact(mob/user) diff --git a/code/game/machinery/synth_pod.dm b/code/game/machinery/synth_pod.dm new file mode 100644 index 000000000000..2ee0c4aaf0cd --- /dev/null +++ b/code/game/machinery/synth_pod.dm @@ -0,0 +1,158 @@ +GLOBAL_LIST_EMPTY(synth_pods) + +// SUIT STORAGE UNIT ///////////////// +/obj/machinery/synth_pod + name = "synthetic storage unit" + desc = "An industrial unit made to store inactive synthetic units for long durations." + icon = 'icons/obj/machines/suit_storage.dmi' + icon_state = "close" + density = TRUE + max_integrity = 500 + circuit = /obj/item/circuitboard/machine/synth_pod + + var/mob/living/carbon/human/stored + // if you add more storage slots, update cook() to clear their radiation too. + + state_open = FALSE + panel_open = FALSE + + var/start_empty_roundstart = FALSE + +/obj/machinery/synth_pod/Initialize(mapload) + . = ..() + + if(mapload && !start_empty_roundstart) + var/mob/living/carbon/human/S = new(src) + S.set_species(/datum/species/wy_synth) + stored = S + var/datum/outfit/job/synthetic/SO = new() + SO.equip(S) + GLOB.synth_pods += src + update_icon() + +/obj/machinery/synth_pod/Destroy() + . = ..() + GLOB.synth_pods -= src + +/obj/machinery/synth_pod/update_overlays() + . = ..() + + if(stored) + add_overlay("uvhuman") + else + add_overlay("open") + +/obj/machinery/synth_pod/process() + if(!stored) + return + if(!is_synth(stored)) + return + stored.adjust_nutrition(10) + + +/obj/machinery/synth_pod/MouseDrop_T(atom/A, mob/living/user) + if(!istype(user) || user.stat || !Adjacent(user) || !Adjacent(A) || !isliving(A)) + return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return + if(stored) + to_chat(user, span_warning("This unit is already full.")) + return + + var/mob/living/target = A + + if(!is_synth(target)) + to_chat(user, span_warning("This machine only accepts synthetics.")) + return + + if(target == user) + user.visible_message(span_warning("[user] starts squeezing into [src]!"), span_notice("You start working your way into [src]...")) + else + target.visible_message(span_warning("[user] starts shoving [target] into [src]!"), span_userdanger("[user] starts shoving you into [src]!")) + + if(do_after(user, 3 SECONDS, target)) + if(stored) + return + if(target == user) + user.visible_message(span_warning("[user] slips into [src] and closes the door behind [user.p_them()]!"), "You slip into [src]'s comfy space and shut its door.") + else + target.visible_message("[user] pushes [target] into [src] and shuts its door!", span_userdanger("[user] shoves you into [src] and shuts the door!")) + close_machine(target) + stored = target + update_icon() + + switch_body(target) + +/obj/machinery/synth_pod/proc/switch_body(mob/living/carbon/human/user) + var/datum/species/wy_synth/S = user.dna.species + if(S.mainframe) + S.undeploy(user) + return + var/list/options = list("Stay here") + for(var/obj/machinery/synth_pod/pod in GLOB.synth_pods) + if(pod == src) + continue + if(pod.z != src.z) + continue + if(!pod.stored) + continue + options["[get_area(pod)] ([pod.x], [pod.y])"] = pod + + var/response = tgui_input_list(user, "Which synthetic unit would you like to transfer into?", "Synthetic Personality Transfer", options) + + if(!response || response == "Stay here") + open_machine() + stored = null + update_icon() + return + + if(options[response]) + var/obj/machinery/synth_pod/selected_pod = options[response] + var/mob/living/carbon/human/target_synth = selected_pod.stored + S.transfer(user, target_synth) + selected_pod.open_machine() + selected_pod.stored = null + selected_pod.update_icon() + + + + +/obj/machinery/synth_pod/attackby(obj/item/W, mob/user) + if(default_unfasten_wrench(user, W)) + return + return ..() + +/obj/machinery/synth_pod/attackby(obj/item/I, mob/user, params) + if(panel_open && is_wire_tool(I)) + wires.interact(user) + return + if(!state_open) + if(default_deconstruction_screwdriver(user, "panel", "close", I)) + return + if(default_deconstruction_crowbar(I)) + return + + return ..() + +/obj/machinery/synth_pod/attack_ai(mob/user) + . = ..() + return + /* + if(!isAI(user)) + return + var/mob/living/silicon/ai/AI = user + if(!AI.dashboard.has_completed_project(/datum/ai_project/synth_control)) + to_chat(user, span_warning("You do not have the required program to interface with this machine.")) + return + if(!stored) + to_chat(user, span_warning("There is no synthetic unit stored in this machine.")) + return + if(AI.deploy_to_synth_pod(src)) + open_machine() + var/datum/species/wy_synth/S = stored.dna.species + S.assume_control(AI, stored) + stored = null + update_icon() + */ diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 7c320f600d01..134b526c9ed1 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -125,8 +125,7 @@ levels = lvls else //Yogs end, technically, I guess - var/turf/T = get_turf_global(source) // yogs - get_turf_global instead of get_turf - levels = list(T.z) + levels = SSmapping.get_connected_levels(get_turf_global(source)) // yogs - get_turf_global instead of get_turf /datum/signal/subspace/vocal/copy() var/datum/signal/subspace/vocal/copy = new(source, frequency, virt, language) diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index 95eb877aea4b..54d76fe536b9 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -5,7 +5,7 @@ /obj/machinery/telecomms/allinone name = "telecommunications mainframe" - icon_state = "comm_server" + icon_state = "server" desc = "A compact machine used for portable subspace telecommunications processing." density = TRUE use_power = NO_POWER_USE @@ -18,6 +18,8 @@ /obj/machinery/telecomms/allinone/Initialize(mapload) . = ..() + id = "Telecommunicatons Mainframe" //Does nothing, just prevents from showing NULL + network = "SyndiMain" if (intercept) freq_listening = list(FREQ_SYNDICATE) diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm index e3378014395a..5b34915ff5a1 100644 --- a/code/game/machinery/telecomms/machines/broadcaster.dm +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -35,7 +35,7 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages var/turf/T = get_turf(src) if (T) - signal.levels |= T.z + signal.levels |= SSmapping.get_connected_levels(T) var/signal_message = "[signal.frequency]:[signal.data["message"]]:[signal.data["name"]]" if(signal_message in GLOB.recentmessages) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 8678a0e9db3c..dd883f36f967 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -175,7 +175,7 @@ data = init_data var/turf/T = get_turf(source) if(T) - levels = list(T.z) + levels = SSmapping.get_connected_levels(T) else levels = list(2) if(!("reject" in data)) diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 65f70a4f236b..49747a37587f 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -21,9 +21,9 @@ /obj/machinery/telecomms/relay/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from) // Add our level and send it back - var/turf/T = get_turf(src) - if(can_send(signal) && T) - signal.levels |= T.z + var/turf/relay_turf = get_turf(src) + if(can_send(signal) && relay_turf) + signal.levels |= SSmapping.get_connected_levels(relay_turf) // Checks to see if it can send/receive. diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index bc84eeb744a9..79acdba64a32 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -202,6 +202,7 @@ GLOBAL_LIST_INIT(dye_registry, list( righthand_file = initial(target_type.righthand_file) item_state = initial(target_type.item_state) mob_overlay_icon = initial(target_type.mob_overlay_icon) + worn_icon_state = initial(target_type.worn_icon_state) inhand_x_dimension = initial(target_type.inhand_x_dimension) inhand_y_dimension = initial(target_type.inhand_y_dimension) name = initial(target_type.name) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 6c11dc1e5e3b..13dbfdbb3c20 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -25,7 +25,7 @@ operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/gygax/dark - max_equip = 6 + max_equip = 7 destruction_sleep_duration = 20 /obj/mecha/combat/gygax/dark/loaded/Initialize(mapload) @@ -42,6 +42,8 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/emergency_eject ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion + ME.attach(src) max_ammo() /obj/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null) @@ -56,16 +58,6 @@ ..() overload_action.Grant(user, src) -/obj/mecha/combat/gygax/dark/GrantActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Grant(user, src) - - /obj/mecha/combat/gygax/RemoveActions(mob/living/user, human_occupant = 0) ..() overload_action.Remove(user) - -/obj/mecha/combat/gygax/dark/RemoveActions(mob/living/user, human_occupant = 0) - ..() - thrusters_action.Remove(user) - diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 22d720ff4d54..9a974e27e3b8 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -17,7 +17,7 @@ var/squeak = 0 /obj/mecha/combat/honker/get_stats_part() - var/integrity = obj_integrity/max_integrity*100 + var/integrity = atom_integrity/max_integrity*100 var/cell_charge = get_charge() var/datum/gas_mixture/int_tank_air = internal_tank.return_air() var/tank_pressure = internal_tank ? round(int_tank_air.return_pressure(),0.01) : "None" diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index cedcdc143603..5ce4c06b372e 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -15,19 +15,17 @@ add_req_access = 0 internal_damage_threshold = 25 force = 40 - max_equip = 4 + max_equip = 5 bumpsmash = 1 /obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0) ..() smoke_action.Grant(user, src) - thrusters_action.Grant(user, src) zoom_action.Grant(user, src) /obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0) ..() smoke_action.Remove(user) - thrusters_action.Remove(user) zoom_action.Remove(user) /obj/mecha/combat/marauder/loaded/Initialize(mapload) @@ -40,6 +38,8 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) + ME.attach(src) max_ammo() /obj/mecha/combat/marauder/seraph @@ -53,7 +53,7 @@ wreckage = /obj/structure/mecha_wreckage/seraph internal_damage_threshold = 20 force = 50 - max_equip = 5 + max_equip = 6 /obj/mecha/combat/marauder/seraph/unloaded @@ -71,6 +71,8 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) + ME.attach(src) max_ammo() /obj/mecha/combat/marauder/mauler @@ -80,7 +82,7 @@ operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/mauler - max_equip = 7 + max_equip = 8 destruction_sleep_duration = 20 ejection_distance = 8 @@ -100,6 +102,8 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/emergency_eject(src) // YEET ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) + ME.attach(src) max_ammo() diff --git a/code/game/mecha/combat/sidewinder.dm b/code/game/mecha/combat/sidewinder.dm index 9c40c3ca3caa..d82cf92949e0 100644 --- a/code/game/mecha/combat/sidewinder.dm +++ b/code/game/mecha/combat/sidewinder.dm @@ -44,3 +44,30 @@ playsound(src,'sound/mecha/mechmove01.ogg',40,1) return ..() +/obj/mecha/combat/sidewinder/mamba + desc = "Otherwise nearly identical to the original sidewinder chassis in form, this one has been heavily modified for stealthier, longer-range combat engagements. The fangs are purely aesthetic, though." + name = "\improper Black Mamba" + icon_state = "mamba" + wreckage = /obj/structure/mecha_wreckage/sidewinder/mamba + infra_luminosity = 0 //Cold-blooded + guns_allowed = TRUE //Syndicate bullshit + operation_req_access = list(ACCESS_SYNDICATE) + internals_req_access = list(ACCESS_SYNDICATE) + stepsound = null + turnsound = null + +/obj/mecha/combat/sidewinder/mamba/Initialize(mapload) + . = ..() + if(internal_tank) + internal_tank.set_light_on(FALSE) //remove the light that is granted by the internal canister + internal_tank.set_light_range_power_color(0, 0, COLOR_BLACK) //just turning it off isn't enough apparently + +/obj/mecha/combat/sidewinder/mamba/loaded/Initialize(mapload) + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/venom + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/rapier/razerfang //Not a snake without fangs right? + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + ME.attach(src) + max_ammo() diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 8bbdd4ce7015..b29a2aa291bf 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -7,6 +7,8 @@ icon_state = "mecha_equip" force = 5 max_integrity = 300 + /// Prevents hitting stuff when trying to use certain equipment as tools + item_flags = NOBLUDGEON /// Cooldown after use var/equip_cooldown = 0 /// is the module ready for use @@ -27,8 +29,21 @@ var/destroy_sound = 'sound/mecha/critdestr.ogg' /// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this. var/mech_flags = NONE - //Special melee override for melee weapons + /// Special melee override for melee weapons var/melee_override = FALSE + /// Actions granted by this equipment + var/list/equip_actions = list() + +/obj/item/mecha_parts/mecha_equipment/Initialize(mapload) + . = ..() + var/list/action_type_list = equip_actions.Copy() + equip_actions = list() + for(var/path in action_type_list) + var/datum/action/innate/mecha/equipment/action = new path + action.equipment = src + equip_actions.Add(action) + qdel(action_type_list) + /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) @@ -55,6 +70,8 @@ chassis.occupant_message(span_danger("[src] is destroyed!")) chassis.occupant.playsound_local(chassis, destroy_sound, 50) chassis = null + for(var/datum/action/innate/mecha/equipment/E in equip_actions) + E.Destroy() return ..() /obj/item/mecha_parts/mecha_equipment/try_attach_part(mob/user, obj/mecha/M) @@ -103,7 +120,7 @@ return 0 return 1 -/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target, mob/living/user, params) return 0 /obj/item/mecha_parts/mecha_equipment/proc/start_cooldown() @@ -140,9 +157,21 @@ forceMove(M) log_message("[src] initialized.", LOG_MECHA) update_chassis_page() + ADD_TRAIT(src, TRAIT_NODROP, REF(M)) + item_flags |= NO_MAT_REDEMPTION // terrible + for(var/datum/action/innate/mecha/equipment/action as anything in equip_actions) + action.chassis = M + if(chassis.occupant) + grant_actions(chassis.occupant) return /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto=null) + if(chassis.occupant) + remove_actions(chassis.occupant) + for(var/datum/action/innate/mecha/equipment/action as anything in equip_actions) + action.chassis = null + item_flags &= ~NO_MAT_REDEMPTION + REMOVE_TRAIT(src, TRAIT_NODROP, REF(chassis)) if(chassis.selected == src) src.on_deselect() moveto = moveto || get_turf(chassis) @@ -198,3 +227,16 @@ /obj/item/mecha_parts/mecha_equipment/proc/check_eva() return chassis?.check_eva() +// Some equipment can be used as tools +/obj/item/mecha_parts/mecha_equipment/tool_use_check(mob/living/user, amount) + return (chassis ? (chassis.cell.charge >= energy_drain) : FALSE) // but not if they aren't attached to a mech + +// Grant any actions to the pilot +/obj/item/mecha_parts/mecha_equipment/proc/grant_actions(mob/pilot) + for(var/datum/action/innate/mecha/equipment/action as anything in equip_actions) + action.Grant(pilot) + +// Remove the actions!!!! +/obj/item/mecha_parts/mecha_equipment/proc/remove_actions(mob/pilot) + for(var/datum/action/innate/mecha/equipment/action as anything in equip_actions) + action.Remove(pilot) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 229b5ac12e77..7d27b2d17123 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -38,39 +38,38 @@ if(do_after_cooldown(target)) set_ready_state(FALSE) log_message("Started drilling [target]", LOG_MECHA) - if(isturf(target)) - var/turf/T = target - T.drill_act(src) - set_ready_state(TRUE) - return - while(do_after_mecha(target, drill_delay)) + + var/drilling = FALSE + while(do_after_mecha(target, drilling ? drill_delay : 0)) + drilling = TRUE if(isliving(target)) drill_mob(target, chassis.occupant) playsound(src,'sound/weapons/drill.ogg',40,1) - else if(isobj(target)) - var/obj/O = target - O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target)) + else if(isturf(target)) + var/turf/T = target + playsound(src,'sound/weapons/drill.ogg',40,1) + if(!T.drill_act(src)) // finished drilling + break + else if(target.uses_integrity) + target.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target)) playsound(src,'sound/weapons/drill.ogg',40,1) else - set_ready_state(TRUE) - return + break set_ready_state(TRUE) /turf/proc/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) return /turf/closed/wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - if(drill.do_after_mecha(src, 60 / drill.drill_level)) - drill.log_message("Drilled through [src]", LOG_MECHA) - dismantle_wall(TRUE, FALSE) + drill.log_message("Drilled through [src]", LOG_MECHA) + take_damage(100, BRUTE, MELEE, sound_effect=FALSE) + return uses_integrity // keep drilling until it can't anymore /turf/closed/wall/r_wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - if(drill.drill_level >= DRILL_HARDENED) - if(drill.do_after_mecha(src, 120 / drill.drill_level)) - drill.log_message("Drilled through [src]", LOG_MECHA) - dismantle_wall(TRUE, FALSE) - else + if(drill.drill_level < DRILL_HARDENED) drill.occupant_message(span_danger("[src] is too durable to drill through.")) + return + return ..() /turf/closed/mineral/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) for(var/turf/closed/mineral/M in range(drill.chassis,1)) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index ecf3a724bcc0..20fc86d2584a 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -254,8 +254,8 @@ if(h_boost < 0) chassis.take_damage(-h_boost) repaired = 1 - if(chassis.obj_integrity < chassis.max_integrity && h_boost > 0) - chassis.obj_integrity += min(h_boost, chassis.max_integrity-chassis.obj_integrity) + if(chassis.get_integrity() < chassis.max_integrity && h_boost > 0) + chassis.update_integrity(chassis.get_integrity() + min(h_boost, chassis.max_integrity-chassis.get_integrity())) repaired = 1 if(repaired) if(!chassis.use_power(energy_drain)) @@ -471,7 +471,105 @@ if(..()) radiation_pulse(get_turf(src), rad_per_cycle) +/////////////////////////////////////////// THRUSTERS ///////////////////////////////////////////// +/obj/item/mecha_parts/mecha_equipment/thrusters + name = "generic exosuit thrusters" //parent object, in-game sources will be a child object + desc = "A generic set of thrusters, from an unknown source. Uses not-understood methods to propel exosuits seemingly for free." + icon_state = "thrusters" + equip_actions = list(/datum/action/innate/mecha/equipment/toggle_thrusters) + selectable = FALSE + var/thrusters_active = FALSE + var/datum/effect_system/trail_follow/thrust_trail = /datum/effect_system/trail_follow/sparks + +/obj/item/mecha_parts/mecha_equipment/thrusters/Initialize(mapload) + . = ..() + thrust_trail = new thrust_trail + thrust_trail.set_up(src) + +/obj/item/mecha_parts/mecha_equipment/thrusters/try_attach_part(mob/user, obj/mecha/M) + for(var/obj/item/mecha_parts/mecha_equipment/equip as anything in M.equipment) + if(istype(equip, type)) + to_chat(user, span_warning("[src] already has thrusters!")) + return FALSE + return ..() + +/obj/item/mecha_parts/mecha_equipment/thrusters/attach(obj/mecha/M) + . = ..() + if(thrusters_active) + thrust_trail.start() + RegisterSignal(M, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(thrust)) + +/obj/item/mecha_parts/mecha_equipment/thrusters/detach(atom/moveto) + UnregisterSignal(chassis, COMSIG_MOVABLE_SPACEMOVE) + if(thrusters_active) + thrust_trail.stop() + return ..() + +/obj/item/mecha_parts/mecha_equipment/thrusters/proc/thrust(obj/mecha/exo, movement_dir) + if(!thrusters_active) + return + if(!chassis) + return + return COMSIG_MOVABLE_ALLOW_SPACEMOVE //This parent should never exist in-game outside admeme use, so why not let it be a creative thruster? + +/obj/item/mecha_parts/mecha_equipment/thrusters/get_equip_info() + return "[..()] \[Thrusters: [thrusters_active ? "Enabled" : "Disabled"]\]" + +/obj/item/mecha_parts/mecha_equipment/thrusters/gas + name = "RCS thruster package" + desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments, by expelling gas from the internal life support tank." + thrust_trail = /datum/effect_system/trail_follow/smoke + var/move_cost = 0.05 // moles per step (5 times more than human jetpacks) + +/obj/item/mecha_parts/mecha_equipment/thrusters/gas/thrust(obj/mecha/exo, movement_dir) + if(!thrusters_active) + return + if(!movement_dir) + return + var/obj/machinery/portable_atmospherics/canister/internal_tank = chassis.internal_tank + if(!internal_tank) + return + var/datum/gas_mixture/our_mix = internal_tank.return_air() + var/moles = our_mix.total_moles() + if(moles < move_cost) + thrusters_active = FALSE + thrust_trail.stop() + our_mix.remove(moles) + return + our_mix.remove(move_cost) + return COMSIG_MOVABLE_ALLOW_SPACEMOVE + +/obj/item/mecha_parts/mecha_equipment/thrusters/ion //for mechs with built-in thrusters, should never really exist un-attached to a mech + name = "ion thruster package" + desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments." + thrust_trail = /datum/effect_system/trail_follow/ion + salvageable = FALSE + +/obj/item/mecha_parts/mecha_equipment/thrusters/ion/thrust(obj/mecha/exo, movement_dir) + if(!thrusters_active) + return + if(!chassis.use_power(chassis.step_energy_drain)) + thrusters_active = FALSE + thrust_trail.stop() + return + return COMSIG_MOVABLE_ALLOW_SPACEMOVE + +/datum/action/innate/mecha/equipment/toggle_thrusters + name = "Toggle Thrusters" + button_icon_state = "mech_thrusters_off" + +/datum/action/innate/mecha/equipment/toggle_thrusters/Activate() + var/obj/item/mecha_parts/mecha_equipment/thrusters/thruster = equipment + thruster.thrusters_active = !thruster.thrusters_active + if(thruster.thrusters_active) + thruster.thrust_trail.start() + else + thruster.thrust_trail.stop() + chassis.log_message("Toggled thrusters.", LOG_MECHA) + chassis.occupant_message("Thrusters [thruster.thrusters_active ?"en":"dis"]abled.") + button_icon_state = "mech_thrusters_[thruster.thrusters_active ? "on" : "off"]" + build_all_button_icons() /////////////////////////////////////////// EJECTION ///////////////////////////////////////////// diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 56a7af725331..7ad9827407dd 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -1,8 +1,6 @@ -#define DECONSTRUCT 0 -#define WALL 1 -#define AIRLOCK 2 -//Hydraulic clamp, Kill clamp, Extinguisher, RCD, Cable layer. + +//Hydraulic clamp, Kill clamp, Extinguisher, RCD, RPD, Cable layer. /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp @@ -11,11 +9,29 @@ icon_state = "mecha_clamp" equip_cooldown = 15 energy_drain = 10 + toolspeed = 0.5 + usesound = 'sound/mecha/hydraulic.ogg' + tool_behaviour = TOOL_CROWBAR + equip_actions = list(/datum/action/innate/mecha/equipment/clamp_mode) /// How much damage does it apply when used var/dam_force = 20 var/obj/mecha/working/ripley/cargo_holder harmful = FALSE +/datum/action/innate/mecha/equipment/clamp_mode + name = "Toggle Clamp Mode" + button_icon_state = "clamp_crowbar" + +/datum/action/innate/mecha/equipment/clamp_mode/Activate() + if(equipment.tool_behaviour == TOOL_CROWBAR) + equipment.tool_behaviour = TOOL_WRENCH + else + equipment.tool_behaviour = TOOL_CROWBAR + button_icon_state = "clamp_[equipment.tool_behaviour]" + chassis.balloon_alert(owner, "clamp set to [(equipment.tool_behaviour==TOOL_CROWBAR) ? "pry" : "wrench"]") + playsound(chassis, 'sound/items/change_jaws.ogg', 50, 1) + build_all_button_icons() + /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/mecha/working/ripley/M as obj) if(..()) if(istype(M)) @@ -31,11 +47,18 @@ ..() cargo_holder = null -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/action(atom/target, mob/living/user, params) if(!action_checks(target)) return if(!cargo_holder) return + + // There are two ways things handle being pried, and I'm too lazy to make every single thing use the same one + if(target.tool_act(user, src, tool_behaviour) & TOOL_ACT_MELEE_CHAIN_BLOCKING) + return TRUE + if(target.attackby(src, user, params)) + return TRUE + if(ismecha(target)) var/obj/mecha/M = target var/have_ammo @@ -49,20 +72,14 @@ else to_chat(chassis.occupant, "No providable supplies found in cargo hold") return + if(isobj(target)) var/obj/O = target - if(istype(O, /obj/machinery/door/firedoor)) - var/obj/machinery/door/firedoor/D = O - D.try_to_crowbar(src,chassis.occupant) - return - if(istype(O, /obj/machinery/door/airlock/)) - var/obj/machinery/door/airlock/D = O - D.try_to_crowbar(src,chassis.occupant) - return if(!O.anchored) if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") O.anchored = TRUE + play_tool_sound(chassis) if(do_after_cooldown(target)) cargo_holder.cargo += O O.forceMove(chassis) @@ -242,133 +259,182 @@ name = "mounted RCD" desc = "An exosuit-mounted Rapid Construction Device." icon_state = "mecha_rcd" - equip_cooldown = 10 - energy_drain = 50 + equip_cooldown = 0 // internal RCD will handle it + energy_drain = 0 // uses matter instead of energy range = MECHA_MELEE|MECHA_RANGED item_flags = NO_MAT_REDEMPTION - var/mode = DECONSTRUCT - var/play_sound = TRUE //so fancy mime RCD can be silent + equip_actions = list(/datum/action/innate/mecha/equipment/rcd) + var/rcd_type = /obj/item/construction/rcd/exosuit + var/obj/item/construction/rcd/internal_rcd /obj/item/mecha_parts/mecha_equipment/rcd/Initialize(mapload) . = ..() GLOB.rcd_list += src + internal_rcd = new rcd_type(src) /obj/item/mecha_parts/mecha_equipment/rcd/Destroy() GLOB.rcd_list -= src + if(internal_rcd && !QDELETED(internal_rcd)) + qdel(internal_rcd) return ..() -/obj/item/mecha_parts/mecha_equipment/rcd/action(atom/target) - if(istype(target, /turf/open/space/transit))//>implying these are ever made -Sieve - return - - if(!isturf(target) && !istype(target, /obj/machinery/door/airlock)) - target = get_turf(target) - if(!action_checks(target) || get_dist(chassis, target)>3) - return - if(play_sound) - playsound(chassis, 'sound/machines/click.ogg', 50, 1) - - switch(mode) - if(DECONSTRUCT) - if(iswallturf(target)) - if(istype(target, /turf/closed/wall/r_wall)) - occupant_message("Wall reinforcements are too complex for deconstruction, must be deconstructed manually.") - return - energy_drain = 500 - var/turf/closed/wall/W = target - occupant_message("Deconstructing [W]...") - if(do_after_cooldown(W)) - chassis.spark_system.start() - W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - if(play_sound) - playsound(W, 'sound/items/deconstruct.ogg', 50, 1) - if(target == /turf/closed/wall/r_wall) - energy_drain = 2000 - else if(isfloorturf(target)) - if(istype(target, /turf/open/floor/engine)) - occupant_message("Floor reinforcements prevent deconstruction, remove before continuing.") - return - energy_drain = 100 - var/turf/open/floor/F = target - occupant_message("Deconstructing [F]...") - if(do_after_cooldown(target)) - chassis.spark_system.start() - F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - if(play_sound) - playsound(F, 'sound/items/deconstruct.ogg', 50, 1) - else if (istype(target, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = target - if(A.damage_deflection > 21) - occupant_message("Airlock too reinforced for deconstruction, remove reinforcements before continuing.") - return - energy_drain = 500 - occupant_message("Deconstructing [target]...") - if(do_after_cooldown(target)) - chassis.spark_system.start() - qdel(target) - if(play_sound) - playsound(target, 'sound/items/deconstruct.ogg', 50, 1) - if(WALL) - if(isspaceturf(target)) - var/turf/open/space/S = target - occupant_message("Building Floor...") - if(do_after_cooldown(S)) - S.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - if(play_sound) - playsound(S, 'sound/items/deconstruct.ogg', 50, 1) - chassis.spark_system.start() - else if(isfloorturf(target)) - var/turf/open/floor/F = target - energy_drain = 750 - occupant_message("Building Wall...") - if(do_after_cooldown(F)) - F.place_on_top(/turf/closed/wall) - if(play_sound) - playsound(F, 'sound/items/deconstruct.ogg', 50, 1) - chassis.spark_system.start() - if(AIRLOCK) - if(isfloorturf(target)) - energy_drain = 750 - occupant_message("Building Airlock...") - if(do_after_cooldown(target)) - chassis.spark_system.start() - var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target) - T.autoclose = TRUE - if(play_sound) - playsound(target, 'sound/items/deconstruct.ogg', 50, 1) - playsound(target, 'sound/effects/sparks2.ogg', 50, 1) - - - -/obj/item/mecha_parts/mecha_equipment/rcd/do_after_cooldown(atom/target) +/obj/item/mecha_parts/mecha_equipment/rcd/attach(obj/mecha/M) . = ..() + internal_rcd.owner = M -/obj/item/mecha_parts/mecha_equipment/rcd/Topic(href,href_list) - ..() - if(href_list["mode"]) - mode = text2num(href_list["mode"]) - switch(mode) - if(0) - occupant_message("Switched RCD to Deconstruct.") - energy_drain = initial(energy_drain) - if(1) - occupant_message("Switched RCD to Construct.") - energy_drain = 2*initial(energy_drain) - if(2) - occupant_message("Switched RCD to Construct Airlock.") - energy_drain = 2*initial(energy_drain) - return +/obj/item/mecha_parts/mecha_equipment/rcd/detach(atom/moveto) + internal_rcd.owner = null + return ..() + +/obj/item/mecha_parts/mecha_equipment/rcd/action(atom/target, mob/living/user, params) + var/prox_flag = chassis.Adjacent(target) + if(prox_flag && (istype(target, /obj/item/stack) || istype(target, /obj/item/rcd_ammo) || istype(target, /obj/item/rcd_upgrade))) + chassis.matter_resupply(target, user) + return TRUE + if(!isliving(target)) + internal_rcd.afterattack(target, user, prox_flag, params) // RCD itself will handle it + return TRUE /obj/item/mecha_parts/mecha_equipment/rcd/get_equip_info() - return "[..()] \[D|C|A\]" + return "[..()] \[Matter: [internal_rcd ? internal_rcd.matter : 0]/[internal_rcd ? internal_rcd.max_matter : 0]\]" +/datum/action/innate/mecha/equipment/rcd + name = "Change RCD Mode" + button_icon_state = "rcd" + +/datum/action/innate/mecha/equipment/rcd/Activate() + var/obj/item/mecha_parts/mecha_equipment/rcd/E = equipment + E.internal_rcd.ui_interact(owner) /obj/item/mecha_parts/mecha_equipment/rcd/mime //special silent RCD name = "silenced mounted RCD" desc = "An expertly mimed exosuit-mounted Rapid Construction Device. Not a sound is made." - play_sound = FALSE + rcd_type = /obj/item/construction/rcd/exosuit/mime +/obj/item/mecha_parts/mecha_equipment/pipe_dispenser + name = "mounted RPD" + desc = "An exosuit-mounted Rapid Pipe Dispenser" + icon_state = "mecha_pipe_dispenser" + equip_cooldown = 0 // internal RPD will handle it + energy_drain = 0 // uses matter instead of energy + range = MECHA_MELEE|MECHA_RANGED + item_flags = NO_MAT_REDEMPTION + equip_actions = list(/datum/action/innate/mecha/equipment/pipe_dispenser) + var/rpd_type = /obj/item/pipe_dispenser/exosuit // in case there's ever any other type of RPD for mechs for some reason + var/obj/item/pipe_dispenser/internal_rpd + +/obj/item/mecha_parts/mecha_equipment/pipe_dispenser/Initialize(mapload) + . = ..() + internal_rpd = new rpd_type(src) + +/obj/item/mecha_parts/mecha_equipment/pipe_dispenser/Destroy() + if(internal_rpd && !QDELETED(internal_rpd)) + qdel(internal_rpd) + return ..() + +/obj/item/mecha_parts/mecha_equipment/pipe_dispenser/attach(obj/mecha/M) + . = ..() + internal_rpd.owner = M + +/obj/item/mecha_parts/mecha_equipment/pipe_dispenser/detach(atom/moveto) + internal_rpd.owner = null + return ..() + +/obj/item/mecha_parts/mecha_equipment/pipe_dispenser/action(atom/target, mob/living/user, params) + if(internal_rpd.pre_attack(target, user)) + return FALSE + chassis.Beam(target, icon_state="rped_upgrade",time=2) + return TRUE + +/datum/action/innate/mecha/equipment/pipe_dispenser + name = "Change RPD Mode" + button_icon_state = "rpd" + +/datum/action/innate/mecha/equipment/pipe_dispenser/Activate() + var/obj/item/mecha_parts/mecha_equipment/pipe_dispenser/E = equipment + E.internal_rpd.ui_interact(owner) + + +/obj/item/mecha_parts/mecha_equipment/t_scanner + name = "exosuit T-ray scanner" + desc = "An exosuit-mounted terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes. Has much higher range than the handheld version." + icon_state = "mecha_t_scanner" + equip_actions = list(/datum/action/innate/mecha/equipment/t_scanner) + selectable = FALSE + /// Scanning distance + var/distance = 6 + /// Whether the scanning is enabled + var/scanning = FALSE + /// Stored t-ray scan images + var/list/t_ray_images + +/obj/item/mecha_parts/mecha_equipment/t_scanner/attach(obj/mecha/M) + . = ..() + RegisterSignal(M, COMSIG_MOVABLE_MOVED, PROC_REF(on_mech_move)) + +/obj/item/mecha_parts/mecha_equipment/t_scanner/detach(atom/moveto) + UnregisterSignal(chassis, COMSIG_MOVABLE_MOVED) + if(scanning) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/t_scanner/process(delta_time) + if(!update_scan(chassis.occupant)) + return PROCESS_KILL + +/obj/item/mecha_parts/mecha_equipment/t_scanner/proc/on_mech_move() + if(chassis.occupant?.client) + update_scan(chassis.occupant) + +/obj/item/mecha_parts/mecha_equipment/t_scanner/proc/update_scan(mob/pilot, force_remove=FALSE) // twice the range, no downtime + if(!pilot?.client) + return FALSE + if(t_ray_images?.len) + pilot.client.images.Remove(t_ray_images) + QDEL_NULL(t_ray_images) + if(!scanning || force_remove) + return FALSE + + t_ray_images = list() + for(var/obj/O in orange(distance, chassis)) + if(HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) + var/image/I = new(loc = get_turf(O)) + var/mutable_appearance/MA = new(O) + MA.alpha = 128 + MA.dir = O.dir + I.appearance = MA + t_ray_images += I + + if(t_ray_images.len) + pilot.client.images += t_ray_images + + return TRUE + +/obj/item/mecha_parts/mecha_equipment/t_scanner/grant_actions(mob/pilot) + . = ..() + update_scan(pilot) + +/obj/item/mecha_parts/mecha_equipment/t_scanner/remove_actions(mob/pilot) + update_scan(pilot, TRUE) + return ..() + +/datum/action/innate/mecha/equipment/t_scanner + name = "Toggle T-ray Scanner" + button_icon_state = "t_scanner_off" + +/datum/action/innate/mecha/equipment/t_scanner/Activate() + var/obj/item/mecha_parts/mecha_equipment/t_scanner/t_scan = equipment + t_scan.scanning = !t_scan.scanning + t_scan.update_scan(t_scan.chassis.occupant) + t_scan.chassis.occupant_message("You [t_scan.scanning ? "activate" : "deactivate"] [t_scan].") + button_icon_state = "t_scanner_[t_scan.scanning ? "on" : "off"]" + build_all_button_icons() + if(t_scan.scanning) + START_PROCESSING(SSobj, t_scan) + else + STOP_PROCESSING(SSobj, t_scan) + /obj/item/mecha_parts/mecha_equipment/cable_layer name = "cable layer" desc = "Equipment for engineering exosuits. Lays cable along the exosuit's path." @@ -506,8 +572,8 @@ //Dunno where else to put this so shrug /obj/item/mecha_parts/mecha_equipment/ripleyupgrade - name = "Ripley MK-II Conversion Kit" - desc = "A pressurized canopy attachment kit for an Autonomous Power Loader Unit \"Ripley\" MK-I mecha, to convert it to the slower, but space-worthy MK-II design. This kit cannot be removed, once applied." + name = "Firefighter Conversion Kit" + desc = "A pressurized canopy attachment kit for an Autonomous Power Loader Unit MK-I \"Ripley\" mecha, to convert it to the slower, but space-worthy MK-II design. This kit cannot be removed, once applied." icon_state = "ripleyupgrade" /obj/item/mecha_parts/mecha_equipment/ripleyupgrade/can_attach(obj/mecha/working/ripley/M) @@ -526,7 +592,7 @@ return TRUE /obj/item/mecha_parts/mecha_equipment/ripleyupgrade/attach(obj/mecha/M) - var/obj/mecha/working/ripley/mkii/N = new /obj/mecha/working/ripley/mkii(get_turf(M),1) + var/obj/mecha/working/ripley/firefighter/N = new /obj/mecha/working/ripley/firefighter(get_turf(M),1) if(!N) return QDEL_NULL(N.cell) @@ -554,14 +620,10 @@ N.dna_lock = M.dna_lock N.maint_access = M.maint_access N.strafe = M.strafe - N.obj_integrity = M.obj_integrity //This is not a repair tool + N.update_integrity(M.get_integrity()) //This is not a repair tool if (M.name != "\improper APLU MK-I \"Ripley\"") N.name = M.name M.wreckage = 0 qdel(M) playsound(get_turf(N),'sound/items/ratchet.ogg',50,1) return - -#undef DECONSTRUCT -#undef WALL -#undef AIRLOCK diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index baeb6b7ccd1e..b225bb9d4cdd 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -68,6 +68,13 @@ rounds = 5 ammo_type = "bfg" +/obj/item/mecha_ammo/venom + name = "venom ammo" + desc = "A box of venom ammunition for use with the Syndicate LIGMA Snakebite Carbine. No, they don't fit in your C-20r, stop trying." + icon_state = "venom" + rounds = 24 + ammo_type = "venom" + /obj/item/mecha_ammo/missiles_br name = "breaching missiles" desc = "A box of large missiles, ready for loading into a BRM-6 exosuit missile rack." diff --git a/code/game/mecha/equipment/weapons/melee_weapons.dm b/code/game/mecha/equipment/weapons/melee_weapons.dm index dc1c60733b6f..8af238c3c807 100644 --- a/code/game/mecha/equipment/weapons/melee_weapons.dm +++ b/code/game/mecha/equipment/weapons/melee_weapons.dm @@ -45,7 +45,7 @@ /// Effect on hitting something var/hit_effect = ATTACK_EFFECT_SLASH /// Effect of the cleave attack - var/cleave_effect = /obj/effect/temp_visual/dir_setting/firing_effect/mecha_swipe + var/cleave_effect = /obj/effect/temp_visual/dir_setting/firing_effect/sweep_attack /obj/item/mecha_parts/mecha_equipment/melee_weapon/can_attach(obj/mecha/M) if(!..()) @@ -62,7 +62,7 @@ addtimer(CALLBACK(src, PROC_REF(set_ready_state), 1), chassis.melee_cooldown * attack_speed_modifier * check_eva()) //Guns only shoot so fast, but weapons can be used as fast as the chassis can swing it! //Melee weapon attacks are a little different in that they'll override the standard melee attack -/obj/item/mecha_parts/mecha_equipment/melee_weapon/action(atom/target, params) +/obj/item/mecha_parts/mecha_equipment/melee_weapon/action(atom/target, mob/living/user, params) if(!action_checks(target)) return 0 @@ -125,7 +125,7 @@ /obj/item/mecha_parts/mecha_equipment/melee_weapon/proc/cleave_attack() return 0 -/obj/item/mecha_parts/mecha_equipment/melee_weapon/proc/special_hit() //For special effects, slightly simplifies cleave/precise attack procs +/obj/item/mecha_parts/mecha_equipment/melee_weapon/proc/special_hit(atom/target) //For special effects, slightly simplifies cleave/precise attack procs return 1 /obj/item/mecha_parts/mecha_equipment/melee_weapon/on_select() @@ -154,12 +154,12 @@ var/sword_wound_bonus = 0 //Wound bonus if it's supposed to be ouchy beyond just doing damage var/precise_no_mobdamage = FALSE //If our precise attacks have a light touch for mobs var/precise_no_objdamage = FALSE //Same but for objects/structures + /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/special_hit(atom/target) return 0 - /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/shortsword //Our bread-and-butter mech shortsword for both slicing and stabbing baddies - name = "\improper GD6 \"Jaeger\" shortsword" + name = "\improper GD6 \"Jaeger\" Shortsword" desc = "An extendable arm-mounted blade with a nasty edge. It is small and fast enough to deflect some incoming attacks." energy_drain = 20 weapon_damage = 10 @@ -199,7 +199,7 @@ if((isstructure(A) || ismachinery(A) || istype(A, /obj/mecha)) && can_stab_at(chassis, A)) //if it's a big thing we hit anyways. Structures ALWAYS are hit, machines and mechs can be protected var/obj/O = A - if(!O.density) //Make sure it's not an open door or something + if(!O.density && !istype(O, /obj/structure/spacevine)) //Make sure it's not an open door or something continue var/object_damage = max(chassis.force + weapon_damage, minimum_damage) * structure_damage_mult * (istype(A, /obj/mecha) ? mech_damage_multiplier : 1) //Half damage on mechs O.take_damage(object_damage, dam_type, "melee", 0) @@ -210,8 +210,7 @@ O.visible_message(span_danger("[chassis.name] strikes [O] with a wide swing of [src]!")) //Don't really need to make a message for EVERY object, just important ones playsound(O,'sound/weapons/smash.ogg', 50) //metallic bonk noise - var/turf/cleave_effect_loc = get_step(get_turf(src), SOUTHWEST) - new cleave_effect(cleave_effect_loc, chassis.dir) + new cleave_effect(get_turf(src), chassis.dir) /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/precise_attack(atom/target) special_hit(target) @@ -242,7 +241,7 @@ playsound(chassis, attack_sound, 50, 1) /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/energy_axe - name = "\improper SH-NT \"Killerhurtz\" energy axe" + name = "\improper SH-NT \"Killerhurtz\" Energy Axe" desc = "An oversized, destructive-looking axe with a powered edge. While far too big for use by an individual, an exosuit might be able to wield it." icon_state = "mecha_energy_axe" precise_attacks = FALSE //This is not a weapon of precision, it is a weapon of destruction @@ -274,7 +273,7 @@ set_light_on(FALSE) /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/katana //Anime mech sword - name = "\improper HR-2 \"Ronin\" katana" + name = "\improper HR-2 \"Ronin\" Katana" desc = "An oversized, light-weight replica of an ancient style of blade. Still woefully underpowered in D&D." icon_state = "mecha_katana" energy_drain = 15 @@ -289,7 +288,7 @@ sword_wound_bonus = 15 //More bleeding /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/batong - name = "\improper AV-98 \"Ingram\" heavy stun baton" + name = "\improper AV-98 \"Ingram\" Heavy Stun Baton" desc = "A stun baton, but bigger. The tide of toolbox-armed assistants don't stand a chance." icon_state = "mecha_batong" energy_drain = 300 @@ -336,7 +335,7 @@ /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/trogdor //TROGDOR!!!!! (But he's not a robot so I can't make the visible name that) - name = "\improper TO-4 \"Tahu\" flaming chainsword" //ITS ALSO A CHAINSWORD FUCK YEAH + name = "\improper TO-4 \"Tahu\" Flaming Chainsword" //ITS ALSO A CHAINSWORD FUCK YEAH desc = "It's as ridiculous as it is badass. You feel like use of this this might be considered a war crime somewhere." icon_state = "mecha_trogdor" energy_drain = 30 @@ -364,7 +363,7 @@ playsound(L, 'sound/items/welder.ogg', 50, 1) /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/maul - name = "\improper ASW-8 \"Barbatos\" heavy maul" + name = "\improper ASW-8 \"Barbatos\" Heavy Maul" desc = "A massive, unwieldy, mace-like weapon, this thing really looks like something you don't want to be hit by if you're not a fan of being concave." icon_state = "mecha_maul" energy_drain = 40 @@ -386,23 +385,23 @@ do_item_attack_animation(L, hit_effect) /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/rapier - name = "\improper MS-15 \"Gyan\" rapier" + name = "\improper MS-15 \"Gyan\" Rapier" desc = "A remarkably thin blade for a weapon wielded by an exosuit, this rapier is the favorite of syndicate pilots that perfer finesse over brute force." icon_state = "mecha_rapier" energy_drain = 40 cleave = FALSE base_armor_piercing = 25 //50 on precise attack - deflect_bonus = 15 //mech fencing but it parries bullets too because robot reaction time or something + deflect_bonus = 15 //Mech fencing but it parries bullets too because robot reaction time or something structure_damage_mult = 2 //Ever try to shank an engine block? mech_damage_multiplier = 0.75 //Notably better against mechs attack_sharpness = SHARP_POINTY attack_speed_modifier = 0.8 //Counteracts the 0.2 second time between attacks - extended_range = 1 //so we can jump at people + extended_range = 1 //So we can jump at people attack_sound = 'sound/weapons/rapierhit.ogg' sword_wound_bonus = 10 //Stabby var/stab_number = 2 //Stabby stabby var/next_lunge = 0 - var/base_lunge_cd = 1 //cooldown for lunge (in seconds because math) + var/base_lunge_cd = 1 //Cooldown for lunge (in seconds because math) /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/rapier/precise_attack(atom/target) if(get_dist(chassis, target) > 1) //First we hop forward @@ -442,6 +441,7 @@ set_ready_state(0) //Wait till we're done multi-stabbing before we do it again if(i != stab_number) //Only sleep between attacks sleep(0.2 SECONDS) //Slight delay + return TRUE /obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/rapier/proc/do_lunge_at(atom/target) if(world.time < next_lunge) //On cooldown @@ -453,6 +453,42 @@ step_towards(src.chassis, target) next_lunge = world.time + base_lunge_cd * (chassis.melee_cooldown * check_eva()) //If we can attack faster we can lunge faster too +/obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/rapier/razerfang + name = "\improper GAT-98 \"Razerfang\" Dual Daggers" + desc = "A pair of short, hollow blades forged of exceptionally hard metal, these weapons are capable of injecting venom into a target on a successful hit." + icon_state = "mecha_razer" + gender = PLURAL + energy_drain = 40 + cleave = FALSE + base_armor_piercing = 40 //80 on precise attack + deflect_bonus = 5 //Helps, but is a bit to small to be particularly good at it + attack_sharpness = SHARP_POINTY + attack_speed_modifier = 2 //Strike and fall back, let the venom do the work + precise_weapon_damage = -25 //Tiny dagger + minimum_damage = 10 //So we don't do negative damage + extended_range = 1 //So we can jump at people + attack_sound = 'sound/weapons/sword2.ogg' + sword_wound_bonus = 10 //Stabby + stab_number = 2 //Stabby stabby + base_lunge_cd = 5 //Cooldown for lunge (in seconds because math) + var/venom_cd = 5 SECONDS //No infinite stacking of venom in people super easily please + var/next_venom = 0 + var/venom_type = /datum/reagent/toxin/venom + var/inject_volume = 6 //12 units per hit by default + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/rapier/razerfang/special_hit(atom/target) + if(!iscarbon(target)) + return + var/mob/living/carbon/C = target + if(world.time > next_venom) + C.reagents.add_reagent(venom_type, inject_volume) //Should ruin your day without charcoal + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/sword/rapier/razerfang/precise_attack(atom/target) + if(..() && iscarbon(target)) + next_venom = world.time + venom_cd //do this here so that we only reset the cooldown after a full attack on a carbon + + + // //=========================================================\\ //======|| SNOWFLAKE WEAPONS THAT ARENT SWORDS || @@ -460,25 +496,23 @@ /obj/item/mecha_parts/mecha_equipment/melee_weapon/rocket_fist //Passive upgrade weapon when selected, makes your mech punch harder AND faster - name = "\improper RS-77 \"Atom Smasher\" rocket fist" + name = "\improper RS-77 \"Atom Smasher\" Rocket Fist" desc = "A large metal fist fitted to the arm of an exosuit, it uses repurposed maneuvering thrusters from a Raven battlecruiser to give a little more oomph to every punch. Also helps increase the speed at which the mech is able to return to a ready stance after each swing." icon_state = "mecha_rocket_fist" weapon_damage = 20 /obj/item/mecha_parts/mecha_equipment/melee_weapon/rocket_fist/precise_attack(atom/target) - target.mech_melee_attack(chassis, FALSE) //DONT SET THIS TO TRUE + target.mech_melee_attack(chassis, chassis.force + weapon_damage, FALSE) //DONT SET THIS TO TRUE /obj/item/mecha_parts/mecha_equipment/melee_weapon/rocket_fist/on_select() - chassis.force += weapon_damage //PUNCH HARDER chassis.melee_cooldown *= 0.8 //PUNCH FASTER /obj/item/mecha_parts/mecha_equipment/melee_weapon/rocket_fist/on_deselect() - chassis.force -= weapon_damage //Return to babby fist chassis.melee_cooldown /= 0.8 /obj/item/mecha_parts/mecha_equipment/melee_weapon/spear - name = "\improper S5-C \"White Witch\" shortspear" + name = "\improper S5-C \"White Witch\" Shortspear" desc = "A hardened, telescoping metal rod with a wicked-sharp tip. Perfect for punching holes in things normally out of reach." icon_state = "mecha_spear" energy_drain = 30 @@ -536,3 +570,125 @@ span_userdanger("[chassis.name] penetrates your suits armor with [src]!")) chassis.log_message("Hit [H] with [src.name] (precise attack).", LOG_MECHA) + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop + name = "heavy mop" + desc = "A very big mop, designed to be attached to mechanical exosuits." + icon_state = "mecha_mop" + energy_drain = 5 + attack_sound = 'sound/effects/slosh.ogg' + + cleave = TRUE + precise_attacks = FALSE // cleave only + attack_sharpness = SHARP_NONE + harmful = FALSE + weapon_damage = 0 // no damage + structure_damage_mult = 0 // don't break stuff while trying to clean + equip_actions = list(/datum/action/innate/mecha/equipment/sweeping) + var/auto_sweep = TRUE + +/datum/action/innate/mecha/equipment/sweeping + name = "Toggle Auto-Mop" + button_icon_state = "sweep_on" + +/datum/action/innate/mecha/equipment/sweeping/Activate() + var/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop/mop = equipment + mop.auto_sweep = !mop.auto_sweep + button_icon_state = "sweep_[mop.auto_sweep ? "on" : "off"]" + build_all_button_icons() + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop/attach(obj/mecha/M) + . = ..() + RegisterSignal(M, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_pre_move)) + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop/detach(atom/moveto) + UnregisterSignal(chassis, COMSIG_MOVABLE_PRE_MOVE) + return ..() + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop/can_attach(obj/mecha/M) + if(istype(M, /obj/mecha/working) && M.equipment.len < M.max_equip) + return TRUE + return ..() + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop/proc/on_pre_move(obj/mecha/mech, atom/newloc) + if(!auto_sweep) + return + var/mop_dir = get_dir(mech, newloc) + if(mop_dir != mech.dir) // only sweep things in front of the mech + return + do_mop(mech, newloc) + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop/proc/do_mop(obj/mecha/mech, atom/newloc, throw_power=1) + var/turf/mop_turf = newloc + var/turf/thrown_at = get_edge_target_turf(mop_turf, chassis.dir) + var/cleaned = FALSE + + if(mop_turf.wash(CLEAN_SCRUB)) + cleaned = TRUE + for(var/atom/movable/moved_atom in newloc) + if(istype(moved_atom, /obj/effect/decal/nuclear_waste)) // sweep that nuclear waste under the rug + cleaned = TRUE + playsound(moved_atom, 'sound/effects/gib_step.ogg', 50, 1) + qdel(moved_atom) + continue + if(moved_atom.wash(CLEAN_SCRUB)) + cleaned = TRUE + if(moved_atom.anchored) + continue + if(moved_atom == chassis) // it can clean itself, but not move itself + continue + moved_atom.throw_at(thrown_at, throw_power, 1, mech.occupant, (throw_power > 1)) + if(isliving(moved_atom) && throw_power > 1) + moved_atom.visible_message(span_danger("[mech] mops the floor with [moved_atom]!"), span_userdanger("[mech] mops the floor with you!")) + + if(cleaned) + playsound(newloc, 'sound/effects/slosh.ogg', 25, 1) + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/mop/cleave_attack() + playsound(chassis, attack_sound, 50, 1) + for(var/turf/T in list(get_turf(chassis), get_step(chassis, chassis.dir), get_step(chassis, turn(chassis.dir, -45)), get_step(chassis, turn(chassis.dir, 45)))) + do_mop(chassis, T, 3) // mop the floor with them! + new cleave_effect(get_turf(src), chassis.dir) + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/flyswatter + name = "comically large flyswatter" + desc = "A comically large flyswatter, presumably for killing comically large bugs." + attack_sound = 'sound/effects/snap.ogg' + icon_state = "mecha_flyswatter" + cleave = FALSE + precise_attacks = TRUE + hit_effect = ATTACK_EFFECT_SMASH + ///Things in this list will be instantly splatted. + var/list/strong_against + ///Damage to mobs with the MOB_BUG biotype, quadrupled for simple mobs + var/bug_damage = 30 + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/flyswatter/Initialize(mapload) + . = ..() + strong_against = typecacheof(list( + /mob/living/simple_animal/hostile/poison/bees, + /mob/living/simple_animal/butterfly, + /mob/living/simple_animal/cockroach, + /obj/item/queen_bee + )) + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/flyswatter/precise_attack(atom/target) + var/mob/living/mob_target = target + if(is_type_in_typecache(target, strong_against)) + new /obj/effect/decal/cleanable/insectguts(target.drop_location()) + to_chat(chassis.occupant, span_warning("You easily splat the [target].")) + if(isliving(target)) + var/mob/living/bug = target + bug.death(TRUE) + else + qdel(target) + else if(isliving(target) && (mob_target.mob_biotypes & MOB_BUG)) + mob_target.apply_damage(bug_damage * (ishuman(mob_target) ? 1 : 4), BRUTE, wound_bonus=CANT_WOUND) // bonus damage to simple mobs + target.visible_message(span_warning("[chassis] splats [target] with [src]!"), span_userdanger("[chassis] splats you with [src]!")) + chassis.do_attack_animation(target, hit_effect) + playsound(chassis, attack_sound, 50, 1) + +/obj/item/mecha_parts/mecha_equipment/melee_weapon/flyswatter/can_attach(obj/mecha/M) + if(istype(M, /obj/mecha/working) && M.equipment.len < M.max_equip) + return TRUE + return ..() diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 6069a2acf89b..90617de33e03 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -32,7 +32,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/proc/get_shot_amount() return projectiles_per_shot -/obj/item/mecha_parts/mecha_equipment/weapon/action(atom/target, params) +/obj/item/mecha_parts/mecha_equipment/weapon/action(atom/target, mob/living/user, params) if(!action_checks(target)) return 0 @@ -151,6 +151,7 @@ /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma equip_cooldown = 10 + range = MECHA_MELEE|MECHA_RANGED name = "217-D Heavy Plasma Cutter" desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles." icon_state = "mecha_plasmacutter" @@ -160,6 +161,9 @@ energy_drain = 30 projectile = /obj/projectile/plasma/adv/mech fire_sound = 'sound/weapons/plasma_cutter.ogg' + usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') + toolspeed = 0.25 // high-power cutting + tool_behaviour = TOOL_WELDER harmful = FALSE /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/M) @@ -171,6 +175,18 @@ return 1 return 0 +/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/action(atom/target, mob/living/user, params) + if(!chassis.Adjacent(target)) + return ..() + // Again, two ways using tools can be handled, so check both + if(target.tool_act(chassis.occupant, src, TOOL_WELDER) & TOOL_ACT_MELEE_CHAIN_BLOCKING) + return TRUE + if(target.attackby(src, chassis.occupant, params)) + return TRUE + if(user.a_intent == INTENT_HARM) // hurt things + chassis.default_melee_attack(target) + return TRUE + /obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun equip_cooldown = 10 name = "Exosuit Proto-kinetic Accelerator" @@ -309,7 +325,7 @@ src.rearm() return -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(atom/target) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action(atom/target, mob/living/user, params) if(..()) projectiles -= get_shot_amount() send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info()) @@ -382,6 +398,19 @@ ammo_type = "bfg" fire_sound = 'sound/weapons/lasercannonfire.ogg' +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/venom + name = "\improper K0-B3 \"Snakebite\" Carbine" + desc = "A weapon for combat exosuits. Shoots incendiary bullets." + icon_state = "mecha_venom" + equip_cooldown = 10 + fire_sound = 'sound/weapons/smgshot.ogg' + projectile = /obj/projectile/bullet/c45/venom //yes the same one + projectiles = 24 + projectiles_cache = 24 + projectiles_cache_max = 96 + harmful = TRUE + ammo_type = "venom" + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack name = "\improper SRM-8 missile rack" desc = "A weapon for combat exosuits. Launches light explosive missiles." @@ -548,3 +577,42 @@ var/atom/movable/AM = hit_atom AM.safe_throw_at(get_edge_target_turf(AM,get_dir(src, AM)), 7, 2) qdel(src) + +// pressure washer, technically a gun +/obj/item/mecha_parts/mecha_equipment/weapon/pressure_washer + name = "exosuit-mounted pressure washer" + desc = "A high-power pressure washer." + icon_state = "mecha_washer" + range = MECHA_MELEE|MECHA_RANGED + projectile = /obj/projectile/reagent/pressure_washer + firing_effect_type = null + fire_sound = 'sound/effects/extinguish.ogg' + var/chem_amount = 5 + +/obj/item/mecha_parts/mecha_equipment/weapon/pressure_washer/Initialize(mapload) + . = ..() + create_reagents(1000) + reagents.add_reagent(/datum/reagent/water, 1000) + +/obj/item/mecha_parts/mecha_equipment/weapon/pressure_washer/action(atom/target, mob/living/user, params) + if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) + var/obj/structure/reagent_dispensers/WT = target + WT.reagents.trans_to(src, 1000) + occupant_message(span_notice("Pressure washer refilled.")) + playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) + return TRUE + else if(reagents.total_volume < 1) + occupant_message(span_notice("Not enough water!")) + return TRUE + if(..()) + reagents.remove_reagent(/datum/reagent/water, chem_amount) + return TRUE + return FALSE + +/obj/item/mecha_parts/mecha_equipment/weapon/pressure_washer/can_attach(obj/mecha/M) + if(istype(M, /obj/mecha/working) && M.equipment.len < M.max_equip) + return TRUE + return ..() + +/obj/item/mecha_parts/mecha_equipment/weapon/pressure_washer/get_equip_info() + return "[..()] \[[src.reagents.total_volume]\]" diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 68301e4458eb..dfce37084a96 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -112,7 +112,7 @@ if(recharge_port && !QDELETED(recharge_port)) data["recharge_port"] = list("mech" = null) if(recharge_port.recharging_mech && !QDELETED(recharge_port.recharging_mech)) - data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.obj_integrity, "maxhealth" = recharge_port.recharging_mech.max_integrity, "cell" = null, "name" = recharge_port.recharging_mech.name,) + data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.get_integrity(), "maxhealth" = recharge_port.recharging_mech.max_integrity, "cell" = null, "name" = recharge_port.recharging_mech.name,) if(recharge_port.recharging_mech.cell && !QDELETED(recharge_port.recharging_mech.cell)) data["recharge_port"]["mech"]["cell"] = list( "charge" = recharge_port.recharging_mech.cell.charge, diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index ca45038236cd..d0b15b6428eb 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -56,7 +56,6 @@ "Cyborg", "Ripley", "Odysseus", - "Firefighter", "Clarke", "Gygax", "Durand", @@ -245,8 +244,6 @@ category_override += "Ripley" if(mech_types & EXOSUIT_MODULE_ODYSSEUS) category_override += "Odysseus" - if(mech_types & EXOSUIT_MODULE_FIREFIGHTER) - category_override += "Firefighter" if(mech_types & EXOSUIT_MODULE_GYGAX) category_override += "Gygax" if(mech_types & EXOSUIT_MODULE_DURAND) @@ -612,7 +609,7 @@ data["isProcessingQueue"] = process_queue data["authorization"] = authorization_override data["user_clearance"] = head_or_silicon(user) - data["alert_level"] = GLOB.security_level + data["alert_level"] = SSsecurity_level.get_current_level_as_number() data["combat_parts_allowed"] = combat_parts_allowed(user) data["emagged"] = (obj_flags & EMAGGED) data["silicon_user"] = issilicon(user) @@ -621,7 +618,7 @@ /// Updates the various authorization checks used to determine if combat parts are available to the current user /obj/machinery/mecha_part_fabricator/proc/combat_parts_allowed(mob/user) - return authorization_override || GLOB.security_level >= SEC_LEVEL_RED || head_or_silicon(user) + return authorization_override || SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED || head_or_silicon(user) /// made as a lazy check to allow silicons full access always /obj/machinery/mecha_part_fabricator/proc/head_or_silicon(mob/user) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f92f786b6d81..0c998e467b27 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -4,8 +4,8 @@ #define MECHA_INT_TANK_BREACH (1<<3) #define MECHA_INT_CONTROL_LOST (1<<4) -#define MECHA_MELEE 1 -#define MECHA_RANGED 2 +#define MECHA_MELEE (1<<0) +#define MECHA_RANGED (1<<1) #define FRONT_ARMOUR 1 #define SIDE_ARMOUR 2 @@ -28,6 +28,7 @@ light_range = 8 light_on = FALSE flags_1 = HEAR_1 + demolition_mod = 3 // mech punch go brr var/ruin_mecha = FALSE //if the mecha starts on a ruin, don't automatically give it a tracking beacon to prevent metagaming. var/can_move = 0 //time of next allowed movement var/mob/living/carbon/occupant = null @@ -111,7 +112,6 @@ var/datum/action/innate/mecha/mech_cycle_equip/cycle_action = new var/datum/action/innate/mecha/mech_toggle_lights/lights_action = new var/datum/action/innate/mecha/mech_view_stats/stats_action = new - var/datum/action/innate/mecha/mech_toggle_thrusters/thrusters_action = new var/datum/action/innate/mecha/mech_defence_mode/defence_action = new var/datum/action/innate/mecha/mech_overload_mode/overload_action = new var/datum/effect_system/fluid_spread/smoke/smoke_system = new //not an action, but trigged by one @@ -122,7 +122,6 @@ var/datum/action/innate/mecha/strafe/strafing_action = new //Action vars - var/thrusters_active = FALSE var/defence_mode = FALSE var/defence_mode_deflect_chance = 15 var/leg_overload_mode = FALSE @@ -135,7 +134,7 @@ var/phasing_energy_drain = 200 var/phase_state = "" //icon_state when phasing var/strafe = FALSE //If we are strafing - var/canstrafe = TRUE + var/pivot_step = FALSE var/nextsmash = 0 var/smashcooldown = 3 //deciseconds var/ejection_distance = 0 //violently ejects the pilot when destroyed @@ -303,18 +302,6 @@ /obj/mecha/examine(mob/user) . = ..() - var/integrity = obj_integrity*100/max_integrity - switch(integrity) - if(85 to 100) - . += "It's fully intact." - if(65 to 85) - . += "It's slightly damaged." - if(45 to 65) - . += "It's badly damaged." - if(25 to 45) - . += "It's heavily damaged." - else - . += "It's falling apart." var/hide_weapon = locate(/obj/item/mecha_parts/concealed_weapon_bay) in contents var/hidden_weapon = hide_weapon ? (locate(/obj/item/mecha_parts/mecha_equipment/weapon) in equipment) : null var/list/visible_equipment = equipment - hidden_weapon @@ -415,7 +402,7 @@ else occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell) - var/integrity = obj_integrity/max_integrity*100 + var/integrity = atom_integrity/max_integrity*100 switch(integrity) if(30 to 45) occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1) @@ -481,7 +468,7 @@ //////////////////////////// -/obj/mecha/proc/click_action(atom/target,mob/user,params) +/obj/mecha/proc/click_action(atom/target, mob/user, params) if(!occupant || occupant != user ) return if(!locate(/turf) in list(target,target.loc)) // Prevents inventory from being drilled @@ -517,6 +504,8 @@ var/mob/living/L = user if(!Adjacent(target)) + if(!synth_check(user, SYNTH_RESTRICTED_WEAPON)) + return if(selected && selected.is_ranged()) if(HAS_TRAIT(L, TRAIT_PACIFISM) && selected.harmful) to_chat(user, span_warning("You don't want to harm other living beings!")) @@ -524,9 +513,11 @@ if(HAS_TRAIT(L, TRAIT_NO_STUN_WEAPONS) && !selected.harmful) to_chat(user, span_warning("You cannot use non-lethal weapons!")) return - if(selected.action(target,params)) + if(selected.action(target, user, params)) selected.start_cooldown() else if(selected && selected.is_melee()) + if(!synth_check(user, SYNTH_RESTRICTED_WEAPON)) + return if(isliving(target) && selected.harmful && HAS_TRAIT(L, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm other living beings!")) return @@ -538,19 +529,22 @@ if(HAS_TRAIT(L, TRAIT_PACIFISM) && W.cleave) to_chat(user, span_warning("You don't want to harm other living beings!")) return - if(selected.action(target,params)) + if(selected.action(target, user, params)) selected.start_cooldown() else - if(internal_damage & MECHA_INT_CONTROL_LOST) - target = pick(oview(1,src)) - if(!melee_can_hit || !istype(target, /atom)) - return - if(equipment_disabled) - return - target.mech_melee_attack(src, TRUE) - melee_can_hit = FALSE - spawn(melee_cooldown) - melee_can_hit = TRUE + default_melee_attack(target) + +/obj/mecha/proc/default_melee_attack(atom/target) + if(internal_damage & MECHA_INT_CONTROL_LOST) + target = pick(oview(1,src)) + if(!melee_can_hit || !istype(target, /atom)) + return + if(equipment_disabled) + return + target.mech_melee_attack(src, force, TRUE) + melee_can_hit = FALSE + spawn(melee_cooldown) + melee_can_hit = TRUE /obj/mecha/proc/range_action(atom/target) @@ -573,8 +567,6 @@ . = ..() if(.) return TRUE - if(thrusters_active && movement_dir && use_power(step_energy_drain)) - return TRUE var/atom/movable/backup = get_spacemove_backup() if(backup) @@ -608,8 +600,10 @@ /obj/mecha/proc/domove(direction) if(can_move >= world.time) return FALSE - if(direction == DOWN || direction == UP) - return FALSE //nuh uh + if((direction & (DOWN|UP)) && !get_step_multiz(get_turf(src), direction)) + direction &= ~(DOWN|UP) // remove vertical component + if(!direction) // don't bother moving without a direction + return FALSE if(!Process_Spacemove(direction)) return FALSE if(!has_charge(step_energy_drain)) @@ -656,25 +650,30 @@ /obj/mecha/proc/mechturn(direction) setDir(direction) - if(turnsound) + if(turnsound && has_gravity()) playsound(src,turnsound,40,1) return TRUE /obj/mecha/proc/mechstep(direction) var/current_dir = dir var/result = step(src,direction) - if(strafe) + if(strafe && !pivot_step) setDir(current_dir) - if(result && stepsound) + if(result && stepsound && has_gravity()) playsound(src,stepsound,40,1) return result /obj/mecha/proc/mechsteprand() var/result = step_rand(src) - if(result && stepsound) + if(result && stepsound && has_gravity()) playsound(src,stepsound,40,1) return result +/obj/mecha/setDir() + . = ..() + if(occupant) + occupant.setDir(dir) // keep the pilot facing the direction of the mech or bad things happen + /obj/mecha/Bump(atom/obstacle) var/turf/newloc = get_step(src,dir) var/area/newarea = newloc.loc @@ -702,7 +701,7 @@ if(bumpsmash && occupant) //Need a pilot to push the PUNCH button. if(!equipment_disabled) if(nextsmash < world.time) - obstacle.mech_melee_attack(src, FALSE) //Non-equipment melee attack + obstacle.mech_melee_attack(src, force, FALSE) //Non-equipment melee attack nextsmash = world.time + smashcooldown if(!obstacle || obstacle.CanPass(src,newloc)) step(src,dir) @@ -727,7 +726,7 @@ if(!islist(possible_int_damage) || !length(possible_int_damage)) return if(prob(20)) - if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) + if(ignore_threshold || atom_integrity*100/max_integrity < internal_damage_threshold) for(var/T in possible_int_damage) if(internal_damage & T) possible_int_damage -= T @@ -735,7 +734,7 @@ if(int_dam_flag) setInternalDamage(int_dam_flag) if(prob(5)) - if(ignore_threshold || obj_integrity*100/max_integrity < internal_damage_threshold) + if(ignore_threshold || atom_integrity*100/max_integrity < internal_damage_threshold) var/obj/item/mecha_parts/mecha_equipment/ME = pick(equipment) if(ME) qdel(ME) @@ -967,7 +966,7 @@ visible_message("[user] starts to climb into [name].") if(do_after(user, enter_delay, src)) - if(obj_integrity <= 0) + if(atom_integrity <= 0) to_chat(user, span_warning("You cannot get in the [name], it has been destroyed!")) else if(occupant) to_chat(user, span_danger("[occupant] was faster! Try better next time, loser.")) @@ -1274,6 +1273,13 @@ GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013??? to_chat(user, span_notice("None of the equipment on this exosuit can use this ammo!")) return FALSE +// Matter resupply and upgrades for mounted RCDs +/obj/mecha/proc/matter_resupply(obj/item/I, mob/user) + for(var/obj/item/mecha_parts/mecha_equipment/rcd/R in equipment) + . = R.internal_rcd.attackby(I, user) + if(QDELETED(I)) + return + // Checks the pilot and their clothing for mech speed buffs /obj/mecha/proc/check_eva() var/evaNum = 1 diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index bebbc829af15..fc850f051ffb 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -8,8 +8,9 @@ cycle_action.Grant(user, src) lights_action.Grant(user, src) stats_action.Grant(user, src) - if(canstrafe) - strafing_action.Grant(user, src) + strafing_action.Grant(user, src) + for(var/obj/item/mecha_parts/mecha_equipment/E as anything in equipment) + E.grant_actions(user) /obj/mecha/proc/RemoveActions(mob/living/user, human_occupant = 0) @@ -19,8 +20,9 @@ cycle_action.Remove(user) lights_action.Remove(user) stats_action.Remove(user) - if(canstrafe) - strafing_action.Remove(user) + strafing_action.Remove(user) + for(var/obj/item/mecha_parts/mecha_equipment/E as anything in equipment) + E.remove_actions(user) /datum/action/innate/mecha check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_IMMOBILE | AB_CHECK_CONSCIOUS @@ -134,7 +136,7 @@ /datum/action/innate/mecha/strafe name = "Toggle Strafing. Disabled when Alt is held." - button_icon_state = "strafe" + button_icon_state = "strafe_off" /datum/action/innate/mecha/strafe/Activate() if(!owner || !chassis || chassis.occupant != owner) @@ -151,25 +153,12 @@ occupant_message("Toggled strafing mode [strafe?"on":"off"].") log_message("Toggled strafing mode [strafe?"on":"off"].", LOG_MECHA) + strafing_action.button_icon_state = "strafe_[strafe?"on":"off"]" strafing_action.build_all_button_icons() //////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// //Need to be granted by the mech type, Not default abilities. -/datum/action/innate/mecha/mech_toggle_thrusters - name = "Toggle Thrusters" - button_icon_state = "mech_thrusters_off" - -/datum/action/innate/mecha/mech_toggle_thrusters/Activate() - if(!owner || !chassis || chassis.occupant != owner) - return - if(chassis.get_charge() > 0) - chassis.thrusters_active = !chassis.thrusters_active - button_icon_state = "mech_thrusters_[chassis.thrusters_active ? "on" : "off"]" - chassis.log_message("Toggled thrusters.", LOG_MECHA) - chassis.occupant_message("Thrusters [chassis.thrusters_active ?"en":"dis"]abled.") - - /datum/action/innate/mecha/mech_defence_mode name = "Toggle Defence Mode" button_icon_state = "mech_defence_mode_off" @@ -288,3 +277,18 @@ button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" chassis.occupant_message("En":"#f00\">Dis"]abled phasing.") build_all_button_icons() + +//////////////////////////////////////// Equipment Actions /////////////////////////////////////////////// +//Equipment-based actions like RCD mode selection + +/datum/action/innate/mecha/equipment + var/obj/item/mecha_parts/mecha_equipment/equipment + +/datum/action/innate/mecha/equipment/Grant(mob/living/L, obj/mecha/M, obj/item/mecha_parts/mecha_equipment/E) + if(E) + equipment = E + return ..() + +/datum/action/innate/mecha/equipment/Destroy() + equipment = null + return ..() diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index e0db9909f2f8..4d3e58fe4b07 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -536,166 +536,6 @@ user.visible_message("[user] unfastens the Gygax Armor Plates.", span_notice("You unfasten the Gygax Armor Plates.")) return TRUE -/datum/component/construction/unordered/mecha_chassis/firefighter - result = /datum/component/construction/mecha/firefighter - steps = list( - /obj/item/mecha_parts/part/ripley_torso, - /obj/item/mecha_parts/part/ripley_left_arm, - /obj/item/mecha_parts/part/ripley_right_arm, - /obj/item/mecha_parts/part/ripley_left_leg, - /obj/item/mecha_parts/part/ripley_right_leg, - /obj/item/clothing/suit/fire - ) - -/datum/component/construction/mecha/firefighter - result = /obj/mecha/working/ripley/firefighter - base_icon = "fireripley" - - circuit_control = /obj/item/circuitboard/mecha/ripley/main - circuit_periph = /obj/item/circuitboard/mecha/ripley/peripherals - - inner_plating = /obj/item/stack/sheet/plasteel - inner_plating_amount = 5 - -/datum/component/construction/mecha/firefighter/get_outer_plating_steps() - return list( - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_WELDER, - "desc" = "Internal armor is welded." - ), - - list( - "key" = /obj/item/stack/sheet/plasteel, - "amount" = 5, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is being installed." - ), - - list( - "key" = TOOL_WRENCH, - "back_key" = TOOL_CROWBAR, - "desc" = "External armor is installed." - ), - - list( - "key" = TOOL_WELDER, - "back_key" = TOOL_WRENCH, - "desc" = "External armor is wrenched." - ), -) - -/datum/component/construction/mecha/firefighter/custom_action(obj/item/I, mob/living/user, diff) - if(!..()) - return FALSE - - //TODO: better messages. - switch(index) - if(1) - user.visible_message("[user] connects [parent] hydraulic systems", span_notice("You connect [parent] hydraulic systems.")) - if(2) - if(diff==FORWARD) - user.visible_message("[user] activates [parent] hydraulic systems.", span_notice("You activate [parent] hydraulic systems.")) - else - user.visible_message("[user] disconnects [parent] hydraulic systems", span_notice("You disconnect [parent] hydraulic systems.")) - if(3) - if(diff==FORWARD) - user.visible_message("[user] adds the wiring to [parent].", span_notice("You add the wiring to [parent].")) - else - user.visible_message("[user] deactivates [parent] hydraulic systems.", span_notice("You deactivate [parent] hydraulic systems.")) - if(4) - if(diff==FORWARD) - user.visible_message("[user] adjusts the wiring of [parent].", span_notice("You adjust the wiring of [parent].")) - else - user.visible_message("[user] removes the wiring from [parent].", span_notice("You remove the wiring from [parent].")) - if(5) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", span_notice("You install [I] into [parent].")) - else - user.visible_message("[user] disconnects the wiring of [parent].", span_notice("You disconnect the wiring of [parent].")) - if(6) - if(diff==FORWARD) - user.visible_message("[user] secures the mainboard.", span_notice("You secure the mainboard.")) - else - user.visible_message("[user] removes the central control module from [parent].", span_notice("You remove the central computer mainboard from [parent].")) - if(7) - if(diff==FORWARD) - user.visible_message("[user] installs [I]into [parent].", span_notice("You install [I]into [parent].")) - else - user.visible_message("[user] unfastens the mainboard.", span_notice("You unfasten the mainboard.")) - if(8) - if(diff==FORWARD) - user.visible_message("[user] secures the peripherals control module.", span_notice("You secure the peripherals control module.")) - else - user.visible_message("[user] removes the peripherals control module from [parent].", span_notice("You remove the peripherals control module from [parent].")) - if(9) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", span_notice("You install [I] into [parent].")) - else - user.visible_message("[user] unfastens the peripherals control module.", span_notice("You unfasten the peripherals control module.")) - if(10) - if(diff==FORWARD) - user.visible_message("[user] secures the scanner module.", span_notice("You secure the scanner module.")) - else - user.visible_message("[user] removes the scanner module from [parent].", span_notice("You remove the scanner module from [parent].")) - if(11) - if(diff==FORWARD) - user.visible_message("[user] installs [I] to [parent].", span_notice("You install [I] to [parent].")) - else - user.visible_message("[user] unfastens the scanner module.", span_notice("You unfasten the scanner module.")) - if(12) - if(diff==FORWARD) - user.visible_message("[user] secures the capacitor.", span_notice("You secure the capacitor.")) - else - user.visible_message("[user] removes the capacitor from [parent].", span_notice("You remove the capacitor from [parent].")) - if(13) - if(diff==FORWARD) - user.visible_message("[user] installs [I] into [parent].", span_notice("You install [I] into [parent].")) - else - user.visible_message("[user] unfastens the capacitor.", span_notice("You unfasten the capacitor.")) - if(14) - if(diff==FORWARD) - user.visible_message("[user] secures the power cell.", span_notice("You secure the power cell.")) - else - user.visible_message("[user] pries the power cell from [parent].", span_notice("You pry the power cell from [parent].")) - if(15) - if(diff==FORWARD) - user.visible_message("[user] installs the internal armor layer to [parent].", span_notice("You install the internal armor layer to [parent].")) - else - user.visible_message("[user] unfastens the power cell.", span_notice("You unfasten the power cell.")) - if(16) - if(diff==FORWARD) - user.visible_message("[user] secures the internal armor layer.", span_notice("You secure the internal armor layer.")) - else - user.visible_message("[user] pries internal armor layer from [parent].", span_notice("You pry internal armor layer from [parent].")) - if(17) - if(diff==FORWARD) - user.visible_message("[user] welds the internal armor layer to [parent].", span_notice("You weld the internal armor layer to [parent].")) - else - user.visible_message("[user] unfastens the internal armor layer.", span_notice("You unfasten the internal armor layer.")) - if(18) - if(diff==FORWARD) - user.visible_message("[user] starts to install the external armor layer to [parent].", span_notice("You install the external armor layer to [parent].")) - else - user.visible_message("[user] cuts the internal armor layer from [parent].", span_notice("You cut the internal armor layer from [parent].")) - if(19) - if(diff==FORWARD) - user.visible_message("[user] installs the external reinforced armor layer to [parent].", span_notice("You install the external reinforced armor layer to [parent].")) - else - user.visible_message("[user] removes the external armor from [parent].", span_notice("You remove the external armor from [parent].")) - if(20) - if(diff==FORWARD) - user.visible_message("[user] secures the external armor layer.", span_notice("You secure the external reinforced armor layer.")) - else - user.visible_message("[user] pries external armor layer from [parent].", span_notice("You pry external armor layer from [parent].")) - if(21) - if(diff==FORWARD) - user.visible_message("[user] welds the external armor layer to [parent].", span_notice("You weld the external armor layer to [parent].")) - else - user.visible_message("[user] unfastens the external armor layer.", span_notice("You unfasten the external armor layer.")) - return TRUE - /datum/component/construction/unordered/mecha_chassis/clarke result = /datum/component/construction/mecha/clarke steps = list( diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 70b4dd549bcb..b47a0c059768 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -27,7 +27,7 @@ var/obj/mecha/M = MT.chassis var/list/mech_data = list( name = M.name, - integrity = round((M.obj_integrity / M.max_integrity) * 100), + integrity = round((M.get_integrity() / M.max_integrity) * 100), charge = M.cell ? round(M.cell.percent()) : null, airtank = M.internal_tank ? M.return_pressure() : null, pilot = M.occupant, @@ -88,7 +88,7 @@ var/cell_charge = chassis.get_charge() var/answer = {"Name: [chassis.name]
- Integrity: [round((chassis.obj_integrity/chassis.max_integrity * 100), 0.01)]%
+ Integrity: [round((chassis.get_integrity()/chassis.max_integrity * 100), 0.01)]%
Cell Charge: [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]
Airtank: [chassis.internal_tank ? "[round(chassis.return_pressure(), 0.01)]" : "Not Equipped"] kPa
Pilot: [chassis.occupant || "None"]
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index ba6c833a217e..9794889c8631 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -8,7 +8,7 @@ /obj/mecha/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - if(. && obj_integrity > 0) + if(. && atom_integrity > 0) spark_system.start() switch(damage_flag) if(FIRE) @@ -21,7 +21,7 @@ occupant_message(span_userdanger("Taking damage!")) log_message("Took [damage_amount] points of damage. Damage type: [damage_type]", LOG_MECHA) -/obj/mecha/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/obj/mecha/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) . = ..() if(!damage_amount) return 0 @@ -211,6 +211,15 @@ if(istype(W, /obj/item/mecha_ammo)) ammo_resupply(W, user) return + + if(istype(W, /obj/item/stack) || istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/rcd_upgrade)) + if(matter_resupply(W, user)) + return + + if(istype(W, /obj/item/mecha_parts)) + var/obj/item/mecha_parts/P = W + P.try_attach_part(user, src) + return if(W.GetID()) if(add_req_access || maint_access) @@ -289,26 +298,21 @@ else if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM) user.changeNext_move(CLICK_CD_MELEE) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(W.use_tool(src, user, 0, volume=50, amount=1)) if (internal_damage & MECHA_INT_TANK_BREACH) clearInternalDamage(MECHA_INT_TANK_BREACH) to_chat(user, span_notice("You repair the damaged gas tank.")) else user.visible_message(span_notice("[user] repairs some damage to [name]."), span_notice("You repair some damage to [src].")) - obj_integrity += min(10, max_integrity-obj_integrity) - if(obj_integrity == max_integrity) + update_integrity(atom_integrity + min(10, max_integrity-atom_integrity)) + if(atom_integrity == max_integrity) to_chat(user, span_notice("It looks to be fully repaired now.")) return 1 else to_chat(user, span_warning("The [name] is at full integrity!")) return 1 - else if(istype(W, /obj/item/mecha_parts)) - var/obj/item/mecha_parts/P = W - P.try_attach_part(user, src) - return - else if(istype(W, /obj/item/airlock_scanner)) //yogs start var/obj/item/airlock_scanner/S = W S.show_access(src, user) //yogs end @@ -345,16 +349,12 @@ target.reagents.add_reagent(/datum/reagent/toxin, force/2.5) -/obj/mecha/mech_melee_attack(obj/mecha/M, equip_allowed) - if(!has_charge(melee_energy_drain)) - return 0 - use_power(melee_energy_drain) - if(M.damtype == BRUTE || M.damtype == BURN) - log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") - . = ..() +/obj/mecha/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) + log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])") + return ..(M, punch_force / 2, equip_allowed) /obj/mecha/proc/full_repair(charge_cell) - obj_integrity = max_integrity + update_integrity(max_integrity) if(cell && charge_cell) cell.charge = cell.maxcharge if(internal_damage & MECHA_INT_FIRE) @@ -393,7 +393,7 @@ visual_effect_icon = ATTACK_EFFECT_MECHTOXIN ..() -/obj/mecha/obj_destruction() +/obj/mecha/atom_destruction() if(wreckage) var/mob/living/silicon/ai/AI if(isAI(occupant)) diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm index 81f83e1c5f1f..0eed9e0d2e73 100644 --- a/code/game/mecha/mecha_parts.dm +++ b/code/game/mecha/mecha_parts.dm @@ -7,7 +7,7 @@ icon = 'icons/mecha/mech_construct.dmi' icon_state = "blank" w_class = WEIGHT_CLASS_GIGANTIC - flags_1 = CONDUCT_1 + flags_1 = CONDUCT_1 | RAD_NO_CONTAMINATE_1 /obj/item/mecha_parts/proc/try_attach_part(mob/user, obj/mecha/M) //For attaching parts to a finished mech if(!user.transferItemToLoc(src, M)) @@ -187,11 +187,6 @@ desc = "A set of armor plates for the Durand. Built heavy to resist an incredible amount of brute force." icon_state = "durand_armor" -////////// Firefighter - -/obj/item/mecha_parts/chassis/firefighter - name = "\improper Firefighter chassis" - construct_type = /datum/component/construction/unordered/mecha_chassis/firefighter ////////// Clarke diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 1dff7668054b..9eedcd525deb 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -69,7 +69,7 @@ /obj/mecha/proc/get_stats_part() - var/integrity = obj_integrity/max_integrity*100 + var/integrity = atom_integrity/max_integrity*100 var/cell_charge = get_charge() var/datum/gas_mixture/int_tank_air = 0 var/tank_pressure = 0 @@ -100,7 +100,6 @@ Environment pressure: [environment_pressure>WARNING_HIGH_PRESSURE ? span_danger("[environment_pressure]"): environment_pressure]kPa
Environment temperature: [environment_temperature]°K|[environment_temperature - T0C]°C
[dna_lock?"DNA-locked:
[dna_lock] \[Reset\]
":""]
- [thrusters_action.owner ? "Thrusters: [thrusters_active ? "Enabled" : "Disabled"]
" : ""] [defence_action.owner ? "Defence Mode: [defence_mode ? "Enabled" : "Disabled"]
" : ""] [overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
" : ""] [smoke_action.owner ? "Smoke: [smoke]
" : ""] diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 034d32ab341c..2bf1de084b9c 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -206,11 +206,6 @@ icon_state = "ripley-broken" orig_mecha = /obj/mecha/working/ripley -/obj/structure/mecha_wreckage/ripley/mkii - name = "\improper Ripley MK-II wreckage" - icon_state = "ripleymkii-broken" - orig_mecha = /obj/mecha/working/ripley/mkii - /obj/structure/mecha_wreckage/ripley/firefighter name = "\improper Firefighter wreckage" icon_state = "firefighter-broken" @@ -250,4 +245,10 @@ /obj/structure/mecha_wreckage/sidewinder name = "\improper Sidewinder wreckage" icon_state = "sidewinder-broken" + desc = "It continues to twitch, as if barely alive." orig_mecha = /obj/mecha/combat/sidewinder + +/obj/structure/mecha_wreckage/sidewinder/mamba + name = "\improper mamba wreckage" + icon_state = "mamba-broken" + orig_mecha = /obj/mecha/combat/sidewinder/mamba diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm index d605c64a839b..c379795ff78a 100644 --- a/code/game/mecha/medical/medical.dm +++ b/code/game/mecha/medical/medical.dm @@ -1,19 +1,5 @@ /obj/mecha/medical internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_MEDICAL) - -/obj/mecha/medical/mechturn(direction) - setDir(direction) - playsound(src,'sound/mecha/mechmove01.ogg',40,1) - return 1 - -/obj/mecha/medical/mechstep(direction) - var/result = step(src,direction) - if(result) - playsound(src,'sound/mecha/mechstep.ogg',25,1) - return result - -/obj/mecha/medical/mechsteprand() - var/result = step_rand(src) - if(result) - playsound(src,'sound/mecha/mechstep.ogg',25,1) - return result \ No newline at end of file + stepsound = 'sound/mecha/mechstep.ogg' + turnsound = 'sound/mecha/mechmove01.ogg' + pivot_step = TRUE diff --git a/code/game/mecha/working/clarke.dm b/code/game/mecha/working/clarke.dm index 21219c90f8aa..69dc1e31b3af 100644 --- a/code/game/mecha/working/clarke.dm +++ b/code/game/mecha/working/clarke.dm @@ -6,16 +6,17 @@ max_temperature = 65000 max_integrity = 200 step_in = 1.25 - fast_pressure_step_in = 1.25 - slow_pressure_step_in = 1.8 + fast_pressure_step_in = 1.5 + slow_pressure_step_in = 2 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF light_power = 7 deflect_chance = 10 - armor = list(MELEE = 20, BULLET = 10, LASER = 20, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 70, FIRE = 100, ACID = 100) + flags_1 = HEAR_1 | RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 + armor = list(MELEE = 20, BULLET = 10, LASER = 20, ENERGY = 0, BOMB = 60, BIO = 0, RAD = 100, FIRE = 100, ACID = 100) max_equip = 7 wreckage = /obj/structure/mecha_wreckage/clarke enter_delay = 40 - canstrafe = FALSE + pivot_step = TRUE /// Handles an internal ore box for Clarke var/obj/structure/ore_box/box omnidirectional_attacks = TRUE @@ -50,6 +51,14 @@ var/mob/living/brain/B = M.brainmob hud.show_to(B) +/obj/mecha/working/clarke/domove(direction) + if(ISDIAGONALDIR(direction) && strafe) + if(EWCOMPONENT(dir)) + direction &= ~(NORTH|SOUTH) + else if(NSCOMPONENT(dir)) + direction &= ~(EAST|WEST) + return ..(direction) + //Ore Box Controls ///Special equipment for the Clarke mech, handles moving ore without giving the mech a hydraulic clamp and cargo compartment. diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 046ce62ff769..188555453b57 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -6,7 +6,6 @@ step_in = 1.5 //Move speed, lower is faster. max_temperature = 20000 max_integrity = 200 - light_power = 7 deflect_chance = 15 armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 40, BIO = 0, RAD = 20, FIRE = 100, ACID = 100) max_equip = 6 @@ -18,6 +17,9 @@ enclosed = FALSE //Normal ripley has an open cockpit design enter_delay = 10 //can enter in a quarter of the time of other mechs exit_delay = 10 + /// Custom Ripley step and turning sounds (from TGMC) + stepsound = 'sound/mecha/powerloader_step.ogg' + turnsound = 'sound/mecha/powerloader_turn2.ogg' opacity = FALSE //Ripley has a window /obj/mecha/working/ripley/Move() @@ -59,40 +61,33 @@ . = ..() AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) - -/obj/mecha/working/ripley/mkii - desc = "Autonomous Power Loader Unit MK-II. This prototype Ripley is refitted with a pressurized cabin, trading its prior speed for atmospheric protection" - name = "\improper APLU MK-II \"Ripley\"" - icon_state = "ripleymkii" - 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 - step_in = 3 - armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 40, BIO = 100, RAD = 55, FIRE = 100, ACID = 100) - wreckage = /obj/structure/mecha_wreckage/ripley/mkii - enclosed = TRUE - enter_delay = 40 - silicon_icon_state = null - opacity = TRUE - /obj/mecha/working/ripley/firefighter - desc = "Autonomous Power Loader Unit MK-III. This model is refitted with a pressurized cabin and additional thermal protection." - name = "\improper APLU MK-III \"Firefighter\"" + desc = "Autonomous Power Loader Unit MK-II. This model is fitted with a pressurized cabin and thermal protection." + name = "\improper APLU MK-II \"Firefighter\"" icon_state = "firefighter" max_temperature = 65000 max_integrity = 250 - fast_pressure_step_in = 2 //step_in while in low pressure conditions - slow_pressure_step_in = 4 //step_in while in normal pressure conditions - step_in = 4 + 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 + step_in = 3 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - light_power = 7 - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 70, FIRE = 100, ACID = 100) - max_equip = 5 // More armor, less tools + flags_1 = HEAR_1 | RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) wreckage = /obj/structure/mecha_wreckage/ripley/firefighter enclosed = TRUE enter_delay = 40 silicon_icon_state = null opacity = TRUE +// maybe janitor ERTs could get this or something? +/obj/mecha/working/ripley/janitorial/Initialize(mapload) + . = ..() + var/obj/item/mecha_parts/mecha_equipment/washer = new /obj/item/mecha_parts/mecha_equipment/weapon/pressure_washer + washer.attach(src) + var/obj/item/mecha_parts/mecha_equipment/big_mop = new /obj/item/mecha_parts/mecha_equipment/melee_weapon/mop + big_mop.attach(src) + var/obj/item/mecha_parts/mecha_equipment/swatter = new /obj/item/mecha_parts/mecha_equipment/melee_weapon/flyswatter + swatter.attach(src) /obj/mecha/working/ripley/deathripley desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" @@ -134,10 +129,10 @@ /obj/mecha/working/ripley/mining desc = "An old, dusty mining Ripley." name = "\improper APLU \"Miner\"" - obj_integrity = 75 //Low starting health /obj/mecha/working/ripley/mining/Initialize(mapload) . = ..() + update_integrity(75) //Low starting health if(cell) cell.charge = FLOOR(cell.charge * 0.25, 1) //Starts at very low charge if(prob(70)) //Maybe add a drill diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 6d0ae81b5082..0f979ad1443b 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -23,6 +23,11 @@ pixel_x = target.pixel_x + rand(-4,4) pixel_y = target.pixel_y + rand(-4,4) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + START_PROCESSING(SSobj, src) @@ -52,8 +57,8 @@ qdel(src) return 0 -/obj/effect/acid/Crossed(AM as mob|obj) - . = ..() +/obj/effect/acid/proc/on_entered(datum/source, atom/movable/AM, ...) + if(isliving(AM)) var/mob/living/L = AM if(L.movement_type & FLYING) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 1aa541aa1b7e..da939af96234 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -109,6 +109,13 @@ density = FALSE var/boing = 0 +/obj/effect/anomaly/grav/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/effect/anomaly/grav/anomalyEffect() ..() boing = 1 @@ -126,8 +133,7 @@ if(target && !target.stat) O.throw_at(target, 5, 10) -/obj/effect/anomaly/grav/Crossed(atom/movable/AM) - . = ..() +/obj/effect/anomaly/grav/proc/on_entered(datum/source, atom/movable/AM, ...) gravShock(AM) /obj/effect/anomaly/grav/Bump(atom/A) @@ -171,6 +177,13 @@ /obj/effect/anomaly/flux/explosion explosive = ANOMALY_FLUX_EXPLOSION +/obj/effect/anomaly/flux/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/effect/anomaly/flux/anomalyEffect(delta_time) ..() canshock = 1 @@ -179,8 +192,7 @@ if(prob(delta_time * 2)) // shocks everyone nearby tesla_zap(src, 5, shockdamage*500, TESLA_MOB_DAMAGE) -/obj/effect/anomaly/flux/Crossed(atom/movable/AM) - . = ..() +/obj/effect/anomaly/flux/proc/on_entered(datum/source, atom/movable/AM, ...) mobShock(AM) /obj/effect/anomaly/flux/Bump(atom/A) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index d0540c13aebf..6157d42765d9 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -670,6 +670,32 @@ desc = "This poster reminds employees to not panic in the unlikely event of an emergency." icon_state = "poster37_legit" //36 is taken +/obj/structure/sign/poster/official/nvs_gax + name = "NVS Gax 5th Anniversary" + desc = "This poster commemorates the 5th year of operation for the NVS Gax." + icon_state = "poster38_legit" + +/obj/structure/sign/poster/official/nvs_gax/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/toy/crayon/spraycan)) + var/obj/item/toy/crayon/spraycan/spraycan = I + if(spraycan.is_capped) + to_chat(user, span_warning("Take the cap off first!")) + return ..() + + if(spraycan.check_empty(user)) + return ..() + + name = "Smoke Gas" + desc = "A defaced poster recommending you to smoke some good weed." + icon_state = "smoke_gas" + + + if(spraycan.pre_noise || spraycan.post_noise) + playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5) + user.visible_message("[user] livens up [src] with spray paint!", span_notice("You liven up [src] with spray paint.")) + return + else ..() + /obj/item/wantedposterposter name = "Wanted Poster Poster" desc = "This piece of high-tech machinery prints out a poster on walls that it's used on." diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index f9a73eba6e5d..8e564c0029ff 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -113,7 +113,7 @@ var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = attached_to if(!istype(G)) return - else if(G.obj_integrity && !G.purpose_fulfilled) + else if(G.get_integrity() && !G.purpose_fulfilled) return "
[G.get_arrival_time(FALSE)]
" /obj/effect/countdown/supermatter diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 6d408ecaed6d..a43e008b6b83 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -34,6 +34,10 @@ diseases_to_add += D if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal if(mergeable_decal) @@ -85,7 +89,7 @@ //This is on /cleanable because fuck this ancient mess /obj/effect/decal/cleanable/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER - if(iscarbon(AM) && blood_state && bloodiness > 40) + if(iscarbon(AM) && blood_state && bloodiness > 40 && !HAS_TRAIT(AM, TRAIT_LIGHT_STEP)) SEND_SIGNAL(AM, COMSIG_STEP_ON_BLOOD, src) update_icon() diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index e686f9b57948..d885f080cab0 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -11,6 +11,7 @@ var/dryname = "dried blood" //when the blood lasts long enough, it becomes dry and gets a new name var/drydesc = "Looks like it's been here a while. Eew." //as above var/drytime = 0 + var/footprint_sprite = null /obj/effect/decal/cleanable/blood/Initialize(mapload) . = ..() @@ -130,7 +131,7 @@ /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return -/obj/effect/decal/cleanable/blood/gibs/Crossed(atom/movable/L) +/obj/effect/decal/cleanable/blood/gibs/on_entered(datum/source, atom/movable/L) if(isliving(L) && has_gravity(loc)) playsound(loc, 'sound/effects/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, TRUE) . = ..() @@ -205,9 +206,8 @@ /obj/effect/decal/cleanable/blood/footprints name = "footprints" icon = 'icons/effects/footprints.dmi' - icon_state = "nothingwhatsoever" desc = "WHOSE FOOTPRINTS ARE THESE?" - icon_state = "blood1" + icon_state = "blood_shoes_enter" random_icon_states = null blood_state = BLOOD_STATE_HUMAN //the icon state to load images from var/entered_dirs = 0 @@ -220,28 +220,72 @@ dryname = "dried footprints" drydesc = "HMM... SOMEONE WAS HERE!" +/obj/effect/decal/cleanable/blood/footprints/Initialize(mapload, footprint_sprite) + src.footprint_sprite = footprint_sprite + . = ..() + icon_state = "" //All of the footprint visuals come from overlays + if(mapload) + entered_dirs |= dir //Keep the same appearance as in the map editor + update_appearance(mapload ? (ALL) : (UPDATE_NAME | UPDATE_DESC)) + +//Rotate all of the footprint directions too +/obj/effect/decal/cleanable/blood/footprints/setDir(newdir) + if(dir == newdir) + return ..() + + var/ang_change = dir2angle(newdir) - dir2angle(dir) + var/old_entered_dirs = entered_dirs + var/old_exited_dirs = exited_dirs + entered_dirs = 0 + exited_dirs = 0 + + for(var/Ddir in GLOB.cardinals) + if(old_entered_dirs & Ddir) + entered_dirs |= angle2dir_cardinal(dir2angle(Ddir) + ang_change) + if(old_exited_dirs & Ddir) + exited_dirs |= angle2dir_cardinal(dir2angle(Ddir) + ang_change) + + update_appearance() + return ..() + +/obj/effect/decal/cleanable/blood/footprints/update_name(updates) + switch(footprint_sprite) + if(FOOTPRINT_SPRITE_CLAWS) + name = "clawprints" + if(FOOTPRINT_SPRITE_SHOES) + name = "footprints" + if(FOOTPRINT_SPRITE_PAWS) + name = "pawprints" + dryname = "dried [name]" + return ..() + +/obj/effect/decal/cleanable/blood/footprints/update_desc(updates) + desc = "WHOSE [uppertext(name)] ARE THESE?" + return ..() + +/obj/effect/decal/cleanable/blood/footprints/update_icon() + . = ..() + alpha = min(BLOODY_FOOTPRINT_BASE_ALPHA + (255 - BLOODY_FOOTPRINT_BASE_ALPHA) * bloodiness / (BLOOD_ITEM_MAX / 2), 255) + /obj/effect/decal/cleanable/blood/footprints/update_overlays() . = ..() for(var/Ddir in GLOB.cardinals) if(entered_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["entered-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]1", dir = Ddir) + GLOB.bloody_footprints_cache["entered-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_enter", dir = Ddir) . += bloodstep_overlay if(exited_dirs & Ddir) - var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] + var/image/bloodstep_overlay = GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"] if(!bloodstep_overlay) - GLOB.bloody_footprints_cache["exited-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]2", dir = Ddir) + GLOB.bloody_footprints_cache["exited-[footprint_sprite]-[blood_state]-[Ddir]"] = bloodstep_overlay = image(icon, "[blood_state]_[footprint_sprite]_exit", dir = Ddir) . += bloodstep_overlay - alpha = min(BLOODY_FOOTPRINT_BASE_ALPHA + (255 - BLOODY_FOOTPRINT_BASE_ALPHA) * bloodiness / (BLOOD_ITEM_MAX / 2), 255) - - /obj/effect/decal/cleanable/blood/footprints/examine(mob/user) . = ..() if((shoe_types.len + species_types.len) > 0) - . += "You recognise the footprints as belonging to:" + . += "You recognise the [name] as belonging to:" for(var/sole in shoe_types) var/obj/item/clothing/item = sole var/article = initial(item.gender) == PLURAL ? "Some" : "A" @@ -251,14 +295,14 @@ if(species == "unknown") . += "Some feet." else if(species == "monkey") - . += "[icon2html('icons/mob/monkey.dmi', user, "monkey1")] Some monkey feet." + . += "[icon2html('icons/mob/monkey.dmi', user, "monkey1")] Some monkey paws." else if(species == "human") . += "[icon2html('icons/mob/human_parts.dmi', user, "default_human_l_leg")] Some human feet." else . += "[icon2html('icons/mob/human_parts.dmi', user, "[species]_l_leg")] Some [species] feet." -/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/C) - if(blood_state != C.blood_state) //We only replace footprints of the same type as us +/obj/effect/decal/cleanable/blood/footprints/replace_decal(obj/effect/decal/cleanable/blood/blood_decal) + if(blood_state != blood_decal.blood_state || footprint_sprite != blood_decal.footprint_sprite) //We only replace footprints of the same type as us return FALSE return ..() diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 7936b73ae440..52160c6f1313 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -79,3 +79,10 @@ /obj/effect/decal/cleanable/oil/slippery/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE)) + +/obj/effect/decal/cleanable/oil/synth + name = "circulation fluid" + desc = "It's a white and viscous fluid used by synthetic crewmembers." + color = "#e6e6e6" + icon_state = "synthfloor1" + random_icon_states = list("synthfloor1", "synthfloor2", "synthfloor3", "synthfloor4", "synthfloor5", "synthfloor6", "synthfloor7") diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm index 81f3330f53cf..83583f844b3f 100644 --- a/code/game/objects/effects/effect_system/effects_other.dm +++ b/code/game/objects/effects/effect_system/effects_other.dm @@ -11,7 +11,7 @@ var/active = FALSE var/allow_overlap = FALSE var/auto_process = TRUE - var/qdel_in_time = 10 + var/qdel_in_time = 1 SECONDS var/fadetype = "ion_fade" var/fade = TRUE var/nograv_required = FALSE @@ -65,6 +65,16 @@ /datum/effect_system/trail_follow/steam effect_type = /obj/effect/particle_effect/steam +/datum/effect_system/trail_follow/sparks + effect_type = /obj/effect/particle_effect/sparks + nograv_required = TRUE + fade = FALSE + +/datum/effect_system/trail_follow/smoke + effect_type = /obj/effect/particle_effect/fluid/smoke/trail + nograv_required = TRUE + fade = FALSE + /obj/effect/particle_effect/ion_trails name = "ion trails" icon_state = "ion_trails" @@ -76,7 +86,7 @@ /datum/effect_system/trail_follow/ion effect_type = /obj/effect/particle_effect/ion_trails nograv_required = TRUE - qdel_in_time = 20 + qdel_in_time = 2 SECONDS /datum/effect_system/trail_follow/proc/set_dir(obj/effect/particle_effect/ion_trails/I) I.setDir(holder.dir) diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm index 52da421b47b4..f51946d1efb9 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm @@ -386,8 +386,10 @@ /// Atmos Backpack Resin, transparent, prevents atmos and filters the air /obj/structure/foamedmetal/resin name = "\improper ATMOS Resin" - desc = "A lightweight, transparent resin used to suffocate fires, scrub the air of toxins, and restore the air to a safe temperature. It can be used as base to construct a wall." + desc = "A lightweight, transparent and passable resin used to suffocate fires, scrub the air of toxins, and restore the air to a safe temperature. It can be used as base to construct a wall." opacity = FALSE + density = FALSE + can_atmos_pass = ATMOS_PASS_NO icon_state = "atmos_resin" alpha = 120 max_integrity = 10 @@ -395,6 +397,11 @@ /obj/structure/foamedmetal/resin/Initialize(mapload) . = ..() var/turf/open/location = loc + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_exited), + ) + AddElement(/datum/element/connect_loc, loc_connections) if(!istype(location)) return @@ -422,3 +429,29 @@ potential_tinder.extinguish_mob() for(var/obj/item/potential_tinder in location) potential_tinder.extinguish() + +/obj/structure/foamedmetal/resin/proc/on_entered(datum/source, atom/movable/arrived) + SIGNAL_HANDLER + + if(isliving(arrived)) //I guess living subtype is fine + var/mob/living/living = arrived + living.add_movespeed_modifier(MOVESPEED_ID_RESIN_FOAM, multiplicative_slowdown = 0.4) + +/obj/structure/foamedmetal/resin/proc/on_exited(datum/source, atom/movable/gone, direction) + if(isliving(gone)) + var/mob/living/living = gone + var/turf/T = get_turf(src) + var/turf/them = get_step(T, direction) + + for(var/obj/structure/foamedmetal/resin/S in them) + if(S.loc == living.loc) //No removing speed if has same loc + return + + living.remove_movespeed_modifier(MOVESPEED_ID_RESIN_FOAM) + +/obj/structure/foamedmetal/resin/Destroy() //Make sure to remove the speed if the resin is destroyed while the mob is in it + var/turf/T = get_turf(src) + for(var/mob/living/living in T) + living.remove_movespeed_modifier(MOVESPEED_ID_RESIN_FOAM) + + return ..() diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm index 585fe1433621..f02dfc5396a7 100644 --- a/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/fluid_spread/effects_smoke.dm @@ -156,6 +156,19 @@ /obj/effect/particle_effect/fluid/smoke/transparent opacity = FALSE +/// Special smoke used for the RCS thruster +/obj/effect/particle_effect/fluid/smoke/trail + lifetime = 1 SECONDS + opacity = FALSE + alpha = 100 + +/obj/effect/particle_effect/fluid/smoke/trail/Initialize(mapload, datum/fluid_group/group, ...) + . = ..() + var/matrix/start_transform = matrix(transform)/2 + var/matrix/end_transform = matrix(transform) + transform = start_transform + animate(src, alpha = 0, transform = end_transform, time = lifetime) + /** * A helper proc used to spawn small puffs of smoke. * diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 3b2bfd1de8bd..64a8731dddaa 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -5,6 +5,7 @@ icon = 'icons/effects/effects.dmi' resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF move_resist = INFINITY + uses_integrity = FALSE obj_flags = NONE blocks_emissive = EMISSIVE_BLOCK_GENERIC @@ -17,7 +18,7 @@ /obj/effect/acid_act() return -/obj/effect/mech_melee_attack(obj/mecha/M, equip_allowed) +/obj/effect/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) return 0 /obj/effect/blob_act(obj/structure/blob/B) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index b1a080d6eb71..3124dfb4bc8d 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -193,6 +193,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark) name = "Cyborg" icon_state = "Cyborg" +/obj/effect/landmark/start/synthetic + name = "Synthetic" + icon_state = "Cyborg" + //Department Security spawns diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 930959270c27..ebe2344f13bd 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -86,13 +86,23 @@ icon_state = "uglymine" alpha = 30 var/triggered = 0 + /// Can be set to FALSE if we want a short 'coming online' delay, then set to TRUE. Can still be set off by damage + var/armed = TRUE var/smartmine = FALSE var/disarm_time = 12 SECONDS var/disarm_product = /obj/item/deployablemine // ie what drops when the mine is disarmed + /// Who's got their foot on the mine's pressure plate + /// Stepping on the mine will set this to the first mob who stepped over it + /// The mine will not detonate via movement unless the first mob steps off of it + var/datum/weakref/foot_on_mine /obj/effect/mine/Initialize(mapload) . = ..() - layer = ABOVE_MOB_LAYER + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_exited), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/effect/mine/attackby(obj/I, mob/user, params) if(istype(I, /obj/item/multitool)) @@ -107,32 +117,16 @@ /obj/effect/mine/proc/mineEffect(mob/victim) to_chat(victim, span_danger("*click*")) -/obj/effect/mine/Crossed(AM as mob|obj) - . = ..() - if(isturf(loc)) - if(ismob(AM)) - var/mob/MM = AM - if(!(MM.movement_type & FLYING)) - checksmartmine(AM) - else - if(istype(AM, /obj/projectile)) - return - triggermine(AM) - -/obj/effect/mine/proc/checksmartmine(mob/target) - if(smartmine && target && !HAS_TRAIT(target, TRAIT_MINDSHIELD)) - triggermine(target) - else if(!smartmine) - triggermine(target) - /obj/effect/mine/proc/triggermine(mob/victim) if(triggered) return + if(smartmine && victim && HAS_TRAIT(victim, TRAIT_MINDSHIELD)) + return visible_message(span_danger("[victim] sets off [icon2html(src, viewers(src))] [src]!")) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(1, 0, src) s.start() - mineEffect(victim) + INVOKE_ASYNC(src, PROC_REF(mineEffect), victim) triggered = 1 qdel(src) @@ -257,7 +251,7 @@ /obj/effect/mine/pickup name = "pickup" - desc = "pick me up" + desc = "Pick me up." icon = 'icons/effects/effects.dmi' icon_state = "electricity2" density = FALSE @@ -360,3 +354,45 @@ /obj/effect/mine/creampie/mineEffect(mob/victim) var/obj/item/reagent_containers/food/snacks/pie/cream/P = new /obj/item/reagent_containers/food/snacks/pie/cream(src) P.splat(victim) + +/// Can this mine trigger on the passed movable? +/obj/effect/mine/proc/can_trigger(atom/movable/on_who) + if(triggered || !isturf(loc) || iseffect(on_who)) + return FALSE + + var/mob/living/living_mob + if(ismob(on_who)) + if(!isliving(on_who)) //no ghosties. + return FALSE + living_mob = on_who + + if(living_mob?.incorporeal_move || (on_who.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)) + return foot_on_mine ? IS_WEAKREF_OF(on_who, foot_on_mine) : FALSE //Only go boom if their foot was on the mine PRIOR to flying/phasing. You fucked up, you live with the consequences. + + return TRUE + + +/obj/effect/mine/proc/on_entered(datum/source, atom/movable/arrived) + SIGNAL_HANDLER + + if(!can_trigger(arrived)) + return + // Someone already on it + if(foot_on_mine?.resolve()) + return + + foot_on_mine = WEAKREF(arrived) + visible_message(span_danger("[icon2html(src, viewers(src))] *click*")) + playsound(src, 'sound/machines/click.ogg', 60, TRUE) + +/obj/effect/mine/proc/on_exited(datum/source, atom/movable/gone) + // SIGNAL_HANDLER we're not ready for this + + if(!can_trigger(gone)) + return + // Check that the guy who's on it is stepping off + if(foot_on_mine && !IS_WEAKREF_OF(gone, foot_on_mine)) + return + + triggermine(gone) + foot_on_mine = null diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 521feb5776fb..aefead875e86 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -713,7 +713,6 @@ name = "secure AI circuit board spawner" loot = list( /obj/item/circuitboard/computer/aiupload, - /obj/item/circuitboard/computer/ai_upload_download, /obj/item/circuitboard/computer/borgupload ) diff --git a/code/game/objects/effects/spawners/mystery_box.dm b/code/game/objects/effects/spawners/mystery_box.dm index c7a2ca6f18ba..46fbb2bfc32d 100644 --- a/code/game/objects/effects/spawners/mystery_box.dm +++ b/code/game/objects/effects/spawners/mystery_box.dm @@ -152,6 +152,7 @@ var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg') armor = 20 speedmod = 1.6 + changesource_flags = MIRROR_BADMIN //deliberate admin spawn only var/heal_rate = 1 var/regen_cooldown = 0 diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 08f70d4bd4af..c8d2c42821c7 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -14,7 +14,7 @@ playsound(loc, 'sound/items/welder.ogg', 100, 1) -/obj/structure/spider/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/obj/structure/spider/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE) switch(damage_type) if(BURN) diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index c430cdbd0307..0a2e15a5229e 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -7,11 +7,17 @@ invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit anchored = TRUE +/obj/effect/step_trigger/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/effect/step_trigger/proc/Trigger(atom/movable/A) return 0 -/obj/effect/step_trigger/Crossed(H as mob|obj) - ..() +/obj/effect/step_trigger/proc/on_entered(datum/source, atom/movable/H, ...) if(!H) return if(isobserver(H) && !affect_ghosts) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 124ba550dfcf..3c7795a7f01c 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -20,31 +20,31 @@ . = ..() if(set_color) color = set_color - var/target_pixel_x = 0 - var/target_pixel_y = 0 + var/target_pixel_x = pixel_x + var/target_pixel_y = pixel_y switch(set_dir) if(NORTH) - target_pixel_y = 16 + target_pixel_y += 16 if(SOUTH) - target_pixel_y = -16 + target_pixel_y += -16 layer = ABOVE_MOB_LAYER if(EAST) - target_pixel_x = 16 + target_pixel_x += 16 if(WEST) - target_pixel_x = -16 + target_pixel_x += -16 if(NORTHEAST) - target_pixel_x = 16 - target_pixel_y = 16 + target_pixel_x += 16 + target_pixel_y += 16 if(NORTHWEST) - target_pixel_x = -16 - target_pixel_y = 16 + target_pixel_x += -16 + target_pixel_y += 16 if(SOUTHEAST) - target_pixel_x = 16 - target_pixel_y = -16 + target_pixel_x += 16 + target_pixel_y += -16 layer = ABOVE_MOB_LAYER if(SOUTHWEST) - target_pixel_x = -16 - target_pixel_y = -16 + target_pixel_x += -16 + target_pixel_y += -16 layer = ABOVE_MOB_LAYER animate(src, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = duration) @@ -71,14 +71,14 @@ switch(newdir) if(NORTH) layer = BELOW_MOB_LAYER - pixel_x = rand(-3,3) - pixel_y = rand(4,6) + pixel_x += rand(-3,3) + pixel_y += rand(4,6) if(SOUTH) - pixel_x = rand(-3,3) - pixel_y = rand(-1,1) + pixel_x += rand(-3,3) + pixel_y += rand(-1,1) else - pixel_x = rand(-1,1) - pixel_y = rand(-1,1) + pixel_x += rand(-1,1) + pixel_y += rand(-1,1) ..() /obj/effect/temp_visual/dir_setting/firing_effect/energy @@ -89,11 +89,20 @@ icon_state = "shieldsparkles" duration = 0.3 SECONDS -/obj/effect/temp_visual/dir_setting/firing_effect/mecha_swipe +/obj/effect/temp_visual/dir_setting/firing_effect/sweep_attack icon = 'icons/effects/96x96.dmi' icon_state = "big_slash" + pixel_x = -32 + pixel_y = -32 duration = 0.3 SECONDS +/obj/effect/temp_visual/dir_setting/firing_effect/sweep_attack/semicircle + icon_state = "big_slash_180" + +/obj/effect/temp_visual/dir_setting/firing_effect/sweep_attack/full_circle + icon_state = "big_slash_360" + duration = 0.4 SECONDS + /obj/effect/temp_visual/dir_setting/ninja name = "ninja shadow" icon = 'icons/mob/mob.dmi' diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0e1295fb2b88..8cba73d07b9e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -8,6 +8,16 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) name = "item" icon = 'icons/obj/misc.dmi' blocks_emissive = EMISSIVE_BLOCK_GENERIC + + /* !!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!! + + IF YOU ADD MORE ICON CRAP TO THIS + ENSURE YOU ALSO ADD THE NEW VARS TO CHAMELEON ITEM_ACTION'S update_item() PROC (/datum/action/item_action/chameleon/change/proc/update_item()) + WASHING MASHINE'S dye_item() PROC (/obj/item/proc/dye_item()) + AND ALSO TO THE CHANGELING PROFILE DISGUISE SYSTEMS (/datum/changeling_profile / /datum/antagonist/changeling/proc/create_profile() / /proc/changeling_transform()) + + !!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!! */ + ///icon state name for inhand overlays var/item_state = null ///Icon file for left hand inhand overlays @@ -16,10 +26,21 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/righthand_file = 'icons/mob/inhands/items_righthand.dmi' ///Icon file for mob worn overlays. - ///no var for state because it should *always* be the same as icon_state var/icon/mob_overlay_icon - //Forced mob worn layer instead of the standard preferred ssize. + ///Icon state for mob worn overlays, if null the normal icon_state will be used. + var/worn_icon_state + ///Icon state for the belt overlay, if null the normal icon_state will be used. + var/belt_icon_state + //Forced mob worn layer instead of the standard preferred size. var/alternate_worn_layer + ///The config type to use for greyscaled worn sprites. Both this and greyscale_colors must be assigned to work. + var/greyscale_config_worn + ///The config type to use for greyscaled left inhand sprites. Both this and greyscale_colors must be assigned to work. + var/greyscale_config_inhand_left + ///The config type to use for greyscaled right inhand sprites. Both this and greyscale_colors must be assigned to work. + var/greyscale_config_inhand_right + ///The config type to use for greyscaled belt overlays. Both this and greyscale_colors must be assigned to work. + var/greyscale_config_belt //Dimensions of the icon file used when this item is worn, eg: hats.dmi //eg: 32x32 sprite, 64x64 sprite, etc. @@ -162,6 +183,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if (attack_verb) attack_verb = typelist("attack_verb", attack_verb) + if(!greyscale_config && greyscale_colors && (greyscale_config_worn || greyscale_config_belt || greyscale_config_inhand_right || greyscale_config_inhand_left)) + update_greyscale() + . = ..() // Handle adding item associated actions @@ -267,6 +291,27 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/proc/suicide_act(mob/user) return +/obj/item/set_greyscale(list/colors, new_config, new_worn_config, new_inhand_left, new_inhand_right) + if(new_worn_config) + greyscale_config_worn = new_worn_config + if(new_inhand_left) + greyscale_config_inhand_left = new_inhand_left + if(new_inhand_right) + greyscale_config_inhand_right = new_inhand_right + return ..() + +/// Checks if this atom uses the GAGS system and if so updates the worn and inhand icons +/obj/item/update_greyscale() + . = ..() + if(!greyscale_colors) + return + if(greyscale_config_worn) + /*worn_icon*/mob_overlay_icon = SSgreyscale.GetColoredIconByType(greyscale_config_worn, greyscale_colors) + if(greyscale_config_inhand_left) + lefthand_file = SSgreyscale.GetColoredIconByType(greyscale_config_inhand_left, greyscale_colors) + if(greyscale_config_inhand_right) + righthand_file = SSgreyscale.GetColoredIconByType(greyscale_config_inhand_right, greyscale_colors) + /obj/item/proc/get_sharpness() return sharpness @@ -724,7 +769,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return FALSE /obj/item/proc/get_belt_overlay() //Returns the icon used for overlaying the object on a belt - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state) + var/icon_state_to_use = belt_icon_state || icon_state + if(greyscale_config_belt && greyscale_colors) + return mutable_appearance(SSgreyscale.GetColoredIconByType(greyscale_config_belt, greyscale_colors), icon_state_to_use) + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state_to_use) /obj/item/proc/update_slot_icon() if(!ismob(loc)) @@ -797,7 +845,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return ..() return 0 -/obj/item/mech_melee_attack(obj/mecha/M, equip_allowed) +/obj/item/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) return 0 /obj/item/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index f32892331598..f0ab2f890b99 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -1,6 +1,3 @@ -#define GLOW_MODE 3 -#define LIGHT_MODE 2 -#define REMOVE_MODE 1 /* CONTAINS: @@ -41,6 +38,7 @@ RLD var/linked_switch_id = null //integer variable, the id for the assigned conveyor switch var/obj/machinery/conveyor/last_placed var/color_choice = null + var/silent = FALSE // does it make sound? (used for mime mech RCD) /obj/item/construction/Initialize(mapload) . = ..() @@ -50,13 +48,20 @@ RLD if(upgrade & RCD_UPGRADE_SILO_LINK) silo_mats = AddComponent(/datum/component/remote_materials, "RCD", mapload, FALSE) +/// Used for examining the RCD and for its UI +/obj/item/construction/proc/get_silo_iron() + if(silo_link && silo_mats.mat_container && !silo_mats.on_hold()) + return silo_mats.mat_container.get_material_amount(/datum/material/iron)/500 + return FALSE + /obj/item/construction/examine(mob/user) . = ..() . += "It currently holds [matter]/[max_matter] matter-units." if(upgrade & RCD_UPGRADE_SILO_LINK) . += "Remote storage link state: [silo_link ? "[silo_mats.on_hold() ? "ON HOLD" : "ON"]" : "OFF"]." - if(silo_link && silo_mats.mat_container && !silo_mats.on_hold()) - . += "Remote connection has iron in equivalent to [silo_mats.mat_container.get_material_amount(/datum/material/iron)/500] RCD unit\s." //1 matter for 1 floor tile, as 4 tiles are produced from 1 metal + var/iron = get_silo_iron() + if(iron) + . += "Remote connection has iron in equivalent to [iron] RCD unit\s." //1 matter for 1 floor tile, as 4 tiles are produced from 1 metal /obj/item/construction/Destroy() QDEL_NULL(spark_system) @@ -90,13 +95,15 @@ RLD upgrade |= rcd_up.upgrade if((rcd_up.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats) silo_mats = AddComponent(/datum/component/remote_materials, "RCD", FALSE, FALSE) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + if(!silent) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) qdel(rcd_up) /// Inserts matter into the RCD allowing it to build /obj/item/construction/proc/insert_matter(obj/O, mob/user) if(iscyborg(user)) return FALSE + var/loaded = FALSE if(istype(O, /obj/item/rcd_ammo)) var/obj/item/rcd_ammo/R = O @@ -108,7 +115,8 @@ RLD if(R.ammoamt <= 0) qdel(R) matter += load - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + if(!silent) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) loaded = TRUE else if(istype(O, /obj/item/stack)) loaded = loadwithsheets(O, user) @@ -127,17 +135,20 @@ RLD var/amount_to_use = min(S.amount, maxsheets) S.use(amount_to_use) matter += value*amount_to_use - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + if(!silent) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) to_chat(user, span_notice("You insert [amount_to_use] [S.name] sheets into [src]. ")) return TRUE to_chat(user, span_warning("You can't insert any more [S.name] sheets into [src]!")) return FALSE /obj/item/construction/proc/activate() - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if(!silent) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) /obj/item/construction/attack_self(mob/user) - playsound(src.loc, 'sound/effects/pop.ogg', 50, FALSE) + if(!silent) + playsound(src.loc, 'sound/effects/pop.ogg', 50, FALSE) if(prob(20)) spark_system.start() @@ -169,6 +180,39 @@ RLD silo_mats.silo_log(src, "consume", -amount, "build", materials) return TRUE +/obj/item/construction/ui_data(mob/user) + var/list/data = list() + + //matter in the rcd + var/total_matter = ((upgrade & RCD_UPGRADE_SILO_LINK) && silo_link) ? get_silo_iron() : matter + if(!total_matter) + total_matter = 0 + data["matterLeft"] = total_matter + + //silo details + data["silo_upgraded"] = !!(upgrade & RCD_UPGRADE_SILO_LINK) + data["silo_enabled"] = silo_link + + return data + +///shared action for toggling silo link rcd,rld & plumbing +/obj/item/construction/ui_act(action, list/params) + . = ..() + if(.) + return + + if(action == "toggle_silo") + if(silo_mats) + if(!silo_mats.mat_container && !silo_link) // Allow them to turn off an invalid link + to_chat(usr, span_alert("No silo link detected. Connect to silo via multitool.")) + return FALSE + silo_link = !silo_link + to_chat(usr, span_notice("You change [src]'s storage link state: [silo_link ? "ON" : "OFF"].")) + else + to_chat(usr, span_warning("[src] doesn't have remote storage connection.")) + return TRUE + return FALSE + /obj/item/construction/proc/checkResource(amount, mob/user) if(!silo_link || !silo_mats || !silo_mats.mat_container) . = matter >= amount @@ -213,6 +257,27 @@ RLD return FALSE return TRUE +///each define maps to a variable used for construction in the RCD +#define CONSTRUCTION_MODE "construction_mode" +#define WINDOW_TYPE "window_type" +#define WINDOW_GLASS "window_glass" +#define WINDOW_SIZE "window_size" +#define COMPUTER_DIR "computer_dir" +#define FURNISH_TYPE "furnish_type" +#define FURNISH_COST "furnish_cost" +#define FURNISH_DELAY "furnish_delay" +#define AIRLOCK_TYPE "airlock_type" +#define CONVEYOR_TYPE "conveyor_type" + +///flags to be sent to UI +#define TITLE "title" +#define ICON "icon" + +///flags for creating icons shared by an entire category +#define CATEGORY_ICON_STATE "category_icon_state" +#define CATEGORY_ICON_SUFFIX "category_icon_suffix" +#define TITLE_ICON "ICON=TITLE" + /obj/item/construction/rcd name = "rapid-construction-device (RCD)" icon = 'icons/obj/tools.dmi' @@ -224,7 +289,104 @@ RLD slot_flags = ITEM_SLOT_BELT item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE - var/mode = RCD_FLOORWALL + + ///all stuff used by RCD for construction + var/static/list/root_categories = list( + //1ST ROOT CATEGORY + "Construction" = list( //Stuff you use to make & decorate areas + //Walls & Windows + "Structures" = list( + list(CONSTRUCTION_MODE = RCD_FLOORWALL, ICON = "wallfloor", TITLE = "Wall/Floor"), + list(CONSTRUCTION_MODE = RCD_DECONSTRUCT, ICON = "delete", TITLE = "Deconstruct"), + list(CONSTRUCTION_MODE = RCD_WINDOWGRILLE, WINDOW_TYPE = /obj/structure/window, WINDOW_GLASS = RCD_WINDOW_NORMAL, WINDOW_SIZE = RCD_WINDOW_DIRECTIONAL, ICON = "dirwindow", TITLE = "Directional Window"), + list(CONSTRUCTION_MODE = RCD_WINDOWGRILLE, WINDOW_TYPE = /obj/structure/window/fulltile, WINDOW_GLASS = RCD_WINDOW_NORMAL, WINDOW_SIZE = RCD_WINDOW_FULLTILE, ICON = "fullwindow", TITLE = "Full Tile Window"), + list(CONSTRUCTION_MODE = RCD_WINDOWGRILLE, WINDOW_TYPE = /obj/structure/window/reinforced, WINDOW_GLASS = RCD_WINDOW_REINFORCED, WINDOW_SIZE = RCD_WINDOW_DIRECTIONAL, ICON = "dirwindow_r", TITLE = "Directional Reinforced Window"), + list(CONSTRUCTION_MODE = RCD_WINDOWGRILLE, WINDOW_TYPE = /obj/structure/window/reinforced/fulltile, WINDOW_GLASS = RCD_WINDOW_REINFORCED, WINDOW_SIZE = RCD_WINDOW_FULLTILE, ICON = "fullwindow_r", TITLE = "Full Tile Reinforced Window"), + ), + + //Computers & Machine Frames + "Machines" = list( + list(CONSTRUCTION_MODE = RCD_MACHINE, ICON = "box_1", TITLE = "Machine Frame"), + list(CONSTRUCTION_MODE = RCD_COMPUTER, COMPUTER_DIR = 1, ICON = "cnorth", TITLE = "Computer North"), + list(CONSTRUCTION_MODE = RCD_COMPUTER, COMPUTER_DIR = 2, ICON = "csouth", TITLE = "Computer South"), + list(CONSTRUCTION_MODE = RCD_COMPUTER, COMPUTER_DIR = 4, ICON = "ceast", TITLE = "Computer East"), + list(CONSTRUCTION_MODE = RCD_COMPUTER, COMPUTER_DIR = 8, ICON = "cwest", TITLE = "Computer West"), + ), + + //Interior Design[construction_mode = RCD_FURNISHING is implied] + "Furniture" = list( + list(FURNISH_TYPE = /obj/structure/chair, FURNISH_COST = 8, FURNISH_DELAY = 10, ICON = "chair", TITLE = "Chair"), + list(FURNISH_TYPE = /obj/structure/chair/stool, FURNISH_COST = 8, FURNISH_DELAY = 10, ICON = "stool", TITLE = "Stool"), + list(FURNISH_TYPE = /obj/structure/table, FURNISH_COST = 16, FURNISH_DELAY = 20, ICON = "table",TITLE = "Table"), + list(FURNISH_TYPE = /obj/structure/table/glass, FURNISH_COST = 16, FURNISH_DELAY = 20, ICON = "glass_table", TITLE = "Glass Table"), + ), + + //Conveyors & Switches + "Conveyors" = list( + list(CONSTRUCTION_MODE = RCD_CONVEYOR, ICON = "conveyor_construct", TITLE = "Conveyor Belt"), + list(CONSTRUCTION_MODE = RCD_SWITCH, ICON = "switch-off", TITLE = "Conveyor Switch"), + ) + ), + + //2ND ROOT CATEGORY[construction_mode = RCD_AIRLOCK is implied,"icon=closed"] + "Airlocks" = list( //used to seal/close areas + //Solid Airlocks[airlock_glass = FALSE is implied,no fill_closed overlay] + "Solid Airlocks" = list( + list(AIRLOCK_TYPE = /obj/machinery/door/airlock, TITLE = "Standard", CATEGORY_ICON_STATE = TITLE_ICON), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/public, TITLE = "Public"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/engineering, TITLE = "Engineering"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/atmos, TITLE = "Atmospherics"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/security, TITLE = "Security"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/command, TITLE = "Command"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/medical, TITLE = "Medical"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/research, TITLE = "Research"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/freezer, TITLE = "Freezer"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/virology, TITLE = "Virology"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/mining, TITLE = "Mining"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/maintenance, TITLE = "Maintenance"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/external, TITLE = "External"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/maintenance/external, TITLE = "External Maintenance"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/hatch, TITLE = "Airtight Hatch"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/maintenance_hatch, TITLE = "Maintenance Hatch"), + ), + + //Glass Airlocks[airlock_glass = TRUE is implied,do fill_closed overlay] + "Glass Airlocks" = list( + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/glass, TITLE = "Standard", CATEGORY_ICON_STATE = TITLE_ICON, CATEGORY_ICON_SUFFIX = "Glass"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/public/glass, TITLE = "Public"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/engineering/glass, TITLE = "Engineering"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/atmos/glass, TITLE = "Atmospherics"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/security/glass, TITLE = "Security"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/command/glass, TITLE = "Command"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/medical/glass, TITLE = "Medical"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/research/glass, TITLE = "Research"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/virology/glass, TITLE = "Virology"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/mining/glass, TITLE = "Mining"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/maintenance/glass, TITLE = "Maintenance"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/external/glass, TITLE = "External"), + list(AIRLOCK_TYPE = /obj/machinery/door/airlock/maintenance/external/glass, TITLE = "External Maintenance"), + ), + + //Window Doors[airlock_glass = TRUE is implied] + "Windoors" = list( + list(AIRLOCK_TYPE = /obj/machinery/door/window, ICON = "windoor", TITLE = "Windoor"), + list(AIRLOCK_TYPE = /obj/machinery/door/window/brigdoor, ICON = "secure_windoor", TITLE = "Secure Windoor"), + ), + ), + + //3RD CATEGORY Airlock access,empty list cause airlock_electronics UI will be displayed when this tab is selected + "Airlock Access" = list() + ) + + ///english name for the design to check if it was selected or not + var/design_title = "Wall/Floor" + var/design_category = "Structures" + var/root_category = "Construction" + var/closed = FALSE + ///owner of this rcd. It can either be an construction console or an player + var/owner + + var/construction_mode = RCD_FLOORWALL var/ranged = FALSE var/computer_dir = 1 var/airlock_type = /obj/machinery/door/airlock @@ -244,7 +406,7 @@ RLD var/obj/item/electronics/airlock/airlock_electronics /obj/item/construction/rcd/suicide_act(mob/user) - mode = RCD_FLOORWALL + construction_mode = RCD_FLOORWALL if(!rcd_create(get_turf(user), user)) return SHAME if(isfloorturf(get_turf(user))) @@ -252,350 +414,39 @@ RLD user.visible_message(span_suicide("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..")) return (BRUTELOSS) -/obj/item/construction/rcd/verb/toggle_window_glass_verb() - set name = "RCD : Toggle Window Glass" - set category = "Object" - set src in view(1) - - if(!usr.canUseTopic(src, BE_CLOSE)) - return - - toggle_window_glass(usr) - -/obj/item/construction/rcd/verb/toggle_window_size_verb() - set name = "RCD : Toggle Window Size" - set category = "Object" - set src in view(1) - - if(!usr.canUseTopic(src, BE_CLOSE)) - return - - toggle_window_size(usr) - -/obj/item/construction/rcd/proc/toggle_access(acc) - if (acc == "all") - conf_access = null - else if(acc == "one") - use_one_access = !use_one_access - else - var/req = text2num(acc) - - if (conf_access == null) - conf_access = list() - - if (!(req in conf_access)) - conf_access += req - else - conf_access -= req - if (!conf_access.len) - conf_access = null - -/// Toggles the usage of reinforced or normal glass -/obj/item/construction/rcd/proc/toggle_window_glass(mob/user) - if (window_glass != RCD_WINDOW_REINFORCED) - set_window_type(user, RCD_WINDOW_REINFORCED, window_size) - return - set_window_type(user, RCD_WINDOW_NORMAL, window_size) - -/// Toggles the usage of directional or full tile windows -/obj/item/construction/rcd/proc/toggle_window_size(mob/user) - if (window_size != RCD_WINDOW_DIRECTIONAL) - set_window_type(user, window_glass, RCD_WINDOW_DIRECTIONAL) - return - set_window_type(user, window_glass, RCD_WINDOW_FULLTILE) - -/// Sets the window type to be created based on parameters -/obj/item/construction/rcd/proc/set_window_type(mob/user, glass, size) - window_glass = glass - window_size = size - if(window_glass == RCD_WINDOW_REINFORCED) - if(window_size == RCD_WINDOW_DIRECTIONAL) - window_type = /obj/structure/window/reinforced - else - window_type = /obj/structure/window/reinforced/fulltile - else - if(window_size == RCD_WINDOW_DIRECTIONAL) - window_type = /obj/structure/window - else - window_type = /obj/structure/window/fulltile - - to_chat(user, span_notice("You change \the [src]'s window mode to [window_size] [window_glass] window.")) - -/obj/item/construction/rcd/proc/toggle_silo_link(mob/user) - if(silo_mats) - if(!silo_mats.mat_container) - to_chat(user, span_alert("No silo link detected. Connect to silo via multitool.")) - return FALSE - silo_link = !silo_link - to_chat(user, span_notice("You change \the [src]'s storage link state: [silo_link ? "ON" : "OFF"].")) - else - to_chat(user, span_warning("\the [src] doesn't have remote storage connection.")) - -/obj/item/construction/rcd/proc/get_airlock_image(airlock_type) - var/obj/machinery/door/airlock/proto = airlock_type - var/ic = initial(proto.icon) - var/mutable_appearance/MA = mutable_appearance(ic, "closed") - if(!initial(proto.glass)) - MA.overlays += "fill_closed" - //Not scaling these down to button size because they look horrible then, instead just bumping up radius. - return MA - -/obj/item/construction/rcd/proc/change_computer_dir(mob/user) - if(!user) - return - var/list/computer_dirs = list( - "NORTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "cnorth"), - "EAST" = image(icon = 'icons/mob/radial.dmi', icon_state = "ceast"), - "SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"), - "WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest") - ) - var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - switch(computerdirs) - if("NORTH") - computer_dir = 1 - if("EAST") - computer_dir = 4 - if("SOUTH") - computer_dir = 2 - if("WEST") - computer_dir = 8 - -/** - * Customizes RCD's airlock settings based on user's choices - * - * Arguments: - * * user The mob that is choosing airlock settings - * * remote_anchor The remote anchor for radial menus. If set, it will also remove proximity restrictions from the menus - */ -/obj/item/construction/rcd/proc/change_airlock_setting(mob/user, remote_anchor) - if(!user) - return - - var/list/solid_or_glass_choices = list( - "Solid" = get_airlock_image(/obj/machinery/door/airlock), - "Glass" = get_airlock_image(/obj/machinery/door/airlock/glass), - "Windoor" = image(icon = 'icons/mob/radial.dmi', icon_state = "windoor"), - "Secure Windoor" = image(icon = 'icons/mob/radial.dmi', icon_state = "secure_windoor") - ) - - var/list/solid_choices = list( - "Standard" = get_airlock_image(/obj/machinery/door/airlock), - "Public" = get_airlock_image(/obj/machinery/door/airlock/public), - "Engineering" = get_airlock_image(/obj/machinery/door/airlock/engineering), - "Atmospherics" = get_airlock_image(/obj/machinery/door/airlock/atmos), - "Security" = get_airlock_image(/obj/machinery/door/airlock/security), - "Command" = get_airlock_image(/obj/machinery/door/airlock/command), - "Medical" = get_airlock_image(/obj/machinery/door/airlock/medical), - "Research" = get_airlock_image(/obj/machinery/door/airlock/research), - "Freezer" = get_airlock_image(/obj/machinery/door/airlock/freezer), - "Science" = get_airlock_image(/obj/machinery/door/airlock/science), - "Virology" = get_airlock_image(/obj/machinery/door/airlock/virology), - "Mining" = get_airlock_image(/obj/machinery/door/airlock/mining), - "Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance), - "External" = get_airlock_image(/obj/machinery/door/airlock/external), - "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external), - "Airtight Hatch" = get_airlock_image(/obj/machinery/door/airlock/hatch), - "Maintenance Hatch" = get_airlock_image(/obj/machinery/door/airlock/maintenance_hatch) - ) - - var/list/glass_choices = list( - "Standard" = get_airlock_image(/obj/machinery/door/airlock/glass), - "Public" = get_airlock_image(/obj/machinery/door/airlock/public/glass), - "Engineering" = get_airlock_image(/obj/machinery/door/airlock/engineering/glass), - "Atmospherics" = get_airlock_image(/obj/machinery/door/airlock/atmos/glass), - "Security" = get_airlock_image(/obj/machinery/door/airlock/security/glass), - "Command" = get_airlock_image(/obj/machinery/door/airlock/command/glass), - "Medical" = get_airlock_image(/obj/machinery/door/airlock/medical/glass), - "Research" = get_airlock_image(/obj/machinery/door/airlock/research/glass), - "Science" = get_airlock_image(/obj/machinery/door/airlock/science/glass), - "Virology" = get_airlock_image(/obj/machinery/door/airlock/virology/glass), - "Mining" = get_airlock_image(/obj/machinery/door/airlock/mining/glass), - "Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/glass), - "External" = get_airlock_image(/obj/machinery/door/airlock/external/glass), - "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass) - ) - - var/airlockcat = show_radial_menu(user, remote_anchor || src, solid_or_glass_choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user, remote_anchor), require_near = remote_anchor ? FALSE : TRUE, tooltips = TRUE) - switch(airlockcat) - if("Solid") - if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, remote_anchor || src, solid_choices, radius = 42, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = remote_anchor ? FALSE : TRUE, tooltips = TRUE) - switch(airlockpaint) - if("Standard") - airlock_type = /obj/machinery/door/airlock - if("Public") - airlock_type = /obj/machinery/door/airlock/public - if("Engineering") - airlock_type = /obj/machinery/door/airlock/engineering - if("Atmospherics") - airlock_type = /obj/machinery/door/airlock/atmos - if("Security") - airlock_type = /obj/machinery/door/airlock/security - if("Command") - airlock_type = /obj/machinery/door/airlock/command - if("Medical") - airlock_type = /obj/machinery/door/airlock/medical - if("Research") - airlock_type = /obj/machinery/door/airlock/research - if("Freezer") - airlock_type = /obj/machinery/door/airlock/freezer - if("Science") - airlock_type = /obj/machinery/door/airlock/science - if("Virology") - airlock_type = /obj/machinery/door/airlock/virology - if("Mining") - airlock_type = /obj/machinery/door/airlock/mining - if("Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance - if("External") - airlock_type = /obj/machinery/door/airlock/external - if("External Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance/external - if("Airtight Hatch") - airlock_type = /obj/machinery/door/airlock/hatch - if("Maintenance Hatch") - airlock_type = /obj/machinery/door/airlock/maintenance_hatch - airlock_glass = FALSE - else - airlock_type = /obj/machinery/door/airlock - airlock_glass = FALSE - - if("Glass") - if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, remote_anchor || src, glass_choices, radius = 42, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = remote_anchor ? FALSE : TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - switch(airlockpaint) - if("Standard") - airlock_type = /obj/machinery/door/airlock/glass - if("Public") - airlock_type = /obj/machinery/door/airlock/public/glass - if("Engineering") - airlock_type = /obj/machinery/door/airlock/engineering/glass - if("Atmospherics") - airlock_type = /obj/machinery/door/airlock/atmos/glass - if("Security") - airlock_type = /obj/machinery/door/airlock/security/glass - if("Command") - airlock_type = /obj/machinery/door/airlock/command/glass - if("Medical") - airlock_type = /obj/machinery/door/airlock/medical/glass - if("Research") - airlock_type = /obj/machinery/door/airlock/research/glass - if("Science") - airlock_type = /obj/machinery/door/airlock/science/glass - if("Virology") - airlock_type = /obj/machinery/door/airlock/virology/glass - if("Mining") - airlock_type = /obj/machinery/door/airlock/mining/glass - if("Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance/glass - if("External") - airlock_type = /obj/machinery/door/airlock/external/glass - if("External Maintenance") - airlock_type = /obj/machinery/door/airlock/maintenance/external/glass - airlock_glass = TRUE - else - airlock_type = /obj/machinery/door/airlock/glass - airlock_glass = TRUE - if("Windoor") - airlock_type = /obj/machinery/door/window - airlock_glass = TRUE - if("Secure Windoor") - airlock_type = /obj/machinery/door/window/brigdoor - airlock_glass = TRUE - else - airlock_type = /obj/machinery/door/airlock - airlock_glass = FALSE - -/// Radial menu for choosing the object you want to be created with the furnishing mode -/obj/item/construction/rcd/proc/change_furnishing_type(mob/user) - if(!user) - return - var/static/list/choices = list( - "Chair" = image(icon = 'icons/mob/radial.dmi', icon_state = "chair"), - "Stool" = image(icon = 'icons/mob/radial.dmi', icon_state = "stool"), - "Table" = image(icon = 'icons/mob/radial.dmi', icon_state = "table"), - "Glass Table" = image(icon = 'icons/mob/radial.dmi', icon_state = "glass_table") - ) - var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - switch(choice) - if("Chair") - furnish_type = /obj/structure/chair - furnish_cost = 8 - furnish_delay = 10 - if("Stool") - furnish_type = /obj/structure/chair/stool - furnish_cost = 8 - furnish_delay = 10 - if("Table") - furnish_type = /obj/structure/table - furnish_cost = 16 - furnish_delay = 20 - if("Glass Table") - furnish_type = /obj/structure/table/glass - furnish_cost = 16 - furnish_delay = 20 - /obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) var/list/rcd_results = A.rcd_vals(user, src) if(!rcd_results) return FALSE var/delay = rcd_results["delay"] * delay_mod - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) + var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.construction_mode) + var/datum/beam/rcd_beam if(checkResource(rcd_results["cost"], user)) - if(do_after(user, delay, A)) + if(!A.Adjacent(owner ? owner : user)) // ranged RCDs create beams + if(isatom(owner)) + var/atom/owner_atom = owner + rcd_beam = owner_atom.Beam(A,icon_state="rped_upgrade",time=delay) + else + rcd_beam = Beam(A,icon_state="rped_upgrade",time=delay) + if(do_after(user, delay, (owner ? owner : A))) if(checkResource(rcd_results["cost"], user)) if(A.rcd_act(user, src, rcd_results["mode"])) rcd_effect.end_animation() useResource(rcd_results["cost"], user) activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + if(!silent) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) return TRUE + if(rcd_beam) + qdel(rcd_beam) qdel(rcd_effect) return FALSE -/obj/item/construction/rcd/proc/rcd_switch(atom/A, mob/user) - var/cost = 1 - var/delay = 1 - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) - if(checkResource(cost, user)) - if(do_after(user, delay, A)) - if(checkResource(cost, user)) - rcd_effect.end_animation() - useResource(cost, user) - activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - new /obj/item/conveyor_switch_construct(A) - qdel(rcd_effect) - -/obj/item/construction/rcd/proc/rcd_conveyor(atom/A, mob/user) - var/delay = 5 - var/cost = 5 - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) - if(checkResource(cost, user)) - if(do_after(user, delay, target = A)) - if(checkResource(cost, user)) - rcd_effect.end_animation() - useResource(cost, user) - activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - var/cdir = get_dir(A, user) - if (last_placed) - cdir = get_dir(A, last_placed) - if(cdir in GLOB.cardinals) - last_placed.setDir(get_dir(last_placed, A)) - last_placed = new/obj/machinery/conveyor(A, cdir, linked_switch_id) - qdel(rcd_effect) - /obj/item/construction/rcd/Initialize(mapload) . = ..() airlock_electronics = new(src) airlock_electronics.name = "Access Control" + airlock_electronics.holder = src GLOB.rcd_list += src /obj/item/construction/rcd/Destroy() @@ -603,127 +454,174 @@ RLD GLOB.rcd_list -= src . = ..() -/obj/item/construction/rcd/attack_self(mob/user) - ..() - var/list/choices = list( - "Airlock" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"), - "Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"), - "Grilles & Windows" = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"), - "Floors & Walls" = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor") +/obj/item/construction/rcd/ui_host(mob/user) + return owner || ..() + +/obj/item/construction/rcd/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/rcd) + assets.send(user) + ui = new(user, src, "RapidConstructionDevice", name) + ui.open() + +/obj/item/construction/rcd/ui_static_data(mob/user) + return airlock_electronics.ui_static_data(user) + +/obj/item/construction/rcd/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/rcd), ) - if(upgrade & RCD_UPGRADE_FRAMES) - choices += list( - "Machine Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "machine"), - "Computer Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "computer_dir"), - ) - if(upgrade & RCD_UPGRADE_SILO_LINK) - choices += list( - "Silo Link" = image(icon = 'icons/obj/mining.dmi', icon_state = "silo"), - ) - if(upgrade & RCD_UPGRADE_FURNISHING) - choices += list( - "Furnishing" = image(icon = 'icons/mob/radial.dmi', icon_state = "chair") - ) - if(mode == RCD_AIRLOCK) - choices += list( - "Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"), - "Change Airlock Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlocktype") - ) - else if(mode == RCD_WINDOWGRILLE) - choices += list( - "Change Window Glass" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowtype"), - "Change Window Size" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowsize") - ) - else if(mode == RCD_FURNISHING) - choices += list( - "Change Furnishing Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "chair") - ) - if(upgrade & RCD_UPGRADE_CONVEYORS) - choices += list( - "Conveyor" = image(icon = 'icons/obj/recycling.dmi', icon_state = "conveyor_construct"), - "Switch" = image(icon = 'icons/obj/recycling.dmi', icon_state = "switch-off") - ) - var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) + +/obj/item/construction/rcd/ui_data(mob/user) + var/list/data = ..() + + //main categories + data["selected_root"] = root_category + data["root_categories"] = list() + for(var/category in root_categories) + data["root_categories"] += category + + //create the category list + data["selected_category"] = design_category + data["selected_design"] = design_title + data["categories"] = list() + + var/category_icon_state + var/category_icon_suffix + for(var/list/sub_category as anything in root_categories[root_category]) + var/list/target_category = root_categories[root_category][sub_category] + if(target_category.len == 0) + continue + + //skip category if upgrades were not installed for these + if(sub_category == "Machines" && !(upgrade & RCD_UPGRADE_FRAMES)) + continue + if(sub_category == "Furniture" && !(upgrade & RCD_UPGRADE_FURNISHING)) + continue + if(sub_category == "Conveyors" && !(upgrade & RCD_UPGRADE_CONVEYORS)) + continue + category_icon_state = "" + category_icon_suffix = "" + + var/list/designs = list() //initialize all designs under this category + for(var/i in 1 to target_category.len) + var/list/design = target_category[i] + + //check for special icon flags + if(design[CATEGORY_ICON_STATE] != null) + category_icon_state = design[CATEGORY_ICON_STATE] + if(design[CATEGORY_ICON_SUFFIX] != null) + category_icon_suffix = design[CATEGORY_ICON_SUFFIX] + + //get icon or create it from pre defined flags + var/icon_state + if(design[ICON] != null) + icon_state = design[ICON] + else + icon_state = category_icon_state + if(icon_state == TITLE_ICON) + icon_state = design[TITLE] + icon_state = "[icon_state][category_icon_suffix]" + + //sanitize them so you dont go insane when icon names contain spaces in them + icon_state = sanitize_css_class_name(icon_state) + + designs += list(list("design_id" = i, TITLE = design[TITLE], ICON = icon_state)) + data["categories"] += list(list("cat_name" = sub_category, "designs" = designs)) + + //merge airlock_electronics ui data with this + var/list/airlock_data = airlock_electronics.ui_data(user) + for(var/key in airlock_data) + data[key] = airlock_data[key] + + return data + + +/obj/item/construction/rcd/ui_act(action, params) + . = ..() + if(.) return - switch(choice) - if("Floors & Walls") - mode = RCD_FLOORWALL - if("Airlock") - mode = RCD_AIRLOCK - if("Deconstruct") - mode = RCD_DECONSTRUCT - if("Grilles & Windows") - mode = RCD_WINDOWGRILLE - if("Machine Frames") - mode = RCD_MACHINE - if("Furnishing") - mode = RCD_FURNISHING - if("Computer Frames") - mode = RCD_COMPUTER - change_computer_dir(user) - return - if("Change Access") - airlock_electronics.ui_interact(user) - return - if("Change Airlock Type") - change_airlock_setting(user) - return - if("Change Window Glass") - toggle_window_glass(user) - return - if("Change Window Size") - toggle_window_size(user) - return - if("Change Furnishing Type") - change_furnishing_type(user) - return - if("Silo Link") - toggle_silo_link(user) - return - if("Conveyor") - mode = RCD_CONVEYOR - linked_switch_id = null - last_placed = null - if("Switch") - mode = RCD_SWITCH - else - return - playsound(src, 'sound/effects/pop.ogg', 50, FALSE) - to_chat(user, span_notice("You change RCD's mode to '[choice]'.")) + + switch(action) + if("root_category") + var/new_root = params["root_category"] + if(root_categories[new_root] != null) //is a valid category + root_category = new_root + + if("design") + var/category_name = params["category"] + var/index = params["index"] + + var/list/root = root_categories[root_category] + if(root == null) //not a valid root + return TRUE + var/list/category = root[category_name] + if(category == null) //not a valid category + return TRUE + var/list/design = category[index] + if(design == null) //not a valid design + return TRUE + + design_category = category_name + design_title = design["title"] + + if(category_name == "Structures") + construction_mode = design[CONSTRUCTION_MODE] + if(design[WINDOW_TYPE] != null) + window_type = design[WINDOW_TYPE] + if(design[WINDOW_GLASS] != null) + window_glass = design[WINDOW_GLASS] + if(design[WINDOW_SIZE] != null) + window_size = design[WINDOW_SIZE] + else if(category_name == "Machines") + construction_mode = design[CONSTRUCTION_MODE] + if(design[COMPUTER_DIR] != null) + computer_dir = design[COMPUTER_DIR] + else if(category_name == "Furniture") + construction_mode = RCD_FURNISHING + furnish_type = design[FURNISH_TYPE] + furnish_cost = design[FURNISH_COST] + furnish_delay = design[FURNISH_DELAY] + else if(category_name == "Conveyors") + construction_mode = design[CONSTRUCTION_MODE] + + if(root_category == "Airlocks") + construction_mode = RCD_AIRLOCK + airlock_glass = (category_name != "Solid AirLocks") + airlock_type = design[AIRLOCK_TYPE] + else + airlock_electronics.do_action(action, params) + + return TRUE + +/obj/item/construction/rcd/attack_self(mob/user) + . = ..() + ui_interact(user) /obj/item/construction/rcd/proc/target_check(atom/A, mob/user) // only returns true for stuff the device can actually work with - if((isturf(A) && A.density && mode==RCD_DECONSTRUCT) || (isturf(A) && !A.density) || (istype(A, /obj/machinery/door/airlock) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/grille) || (istype(A, /obj/structure/window) && mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/girder)) + if((isturf(A) && A.density && construction_mode==RCD_DECONSTRUCT) || (isturf(A) && !A.density) || (istype(A, /obj/machinery/door/airlock) && construction_mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/grille) || (istype(A, /obj/structure/window) && construction_mode==RCD_DECONSTRUCT) || istype(A, /obj/structure/girder)) return TRUE else return FALSE /obj/item/construction/rcd/afterattack(atom/A, mob/user, proximity) . = ..() - if (mode == RCD_CONVEYOR) - if(!range_check(A, user) || !target_check(A,user) || istype(A, /obj/machinery/conveyor) || !isopenturf(A) || istype(A, /area/shuttle)) - to_chat(user, "Error! Invalid tile!") - return - if (!linked_switch_id) - to_chat(user, "Error! [src] is not linked!") - return - if (get_turf(A) == get_turf(user)) - to_chat(user, "Cannot place conveyor below your feet!") - return - if(!proximity) - return - rcd_conveyor(A, user) - if (mode == RCD_SWITCH) - if(!range_check(A, user) || !target_check(A,user) || istype(A, /obj/item/conveyor_switch_construct) || !isopenturf(A) || istype(A, /area/shuttle)) - to_chat(user, "Error! Invalid tile!") - return - if(!proximity) - return - rcd_switch(A, user) - else - if(!prox_check(proximity)) - return - rcd_create(A, user) + if(!prox_check(proximity) && !(ranged && range_check(A, user))) + return + if((upgrade & RCD_UPGRADE_CONVEYORS) && istype(A, /obj/machinery/conveyor_switch)) + var/obj/machinery/conveyor_switch/C = A + linked_switch_id = C.id + balloon_alert(user, "linked") + return + rcd_create(A, user) + +/obj/item/construction/rcd/attackby(obj/item/I, mob/user, params) + . = ..() + if((upgrade & RCD_UPGRADE_CONVEYORS) && istype(I, /obj/item/conveyor_switch_construct)) + var/obj/item/conveyor_switch_construct/C = I + linked_switch_id = C.id + balloon_alert(user, "linked") /obj/item/construction/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and \ @@ -796,6 +694,23 @@ RLD matter = 500 canRturf = TRUE +#undef CONSTRUCTION_MODE +#undef WINDOW_TYPE +#undef WINDOW_GLASS +#undef WINDOW_SIZE +#undef COMPUTER_DIR +#undef FURNISH_TYPE +#undef FURNISH_COST +#undef FURNISH_DELAY +#undef AIRLOCK_TYPE + +#undef TITLE +#undef ICON + +#undef CATEGORY_ICON_STATE +#undef CATEGORY_ICON_SUFFIX +#undef TITLE_ICON + /obj/item/rcd_ammo name = "compressed matter cartridge" desc = "Highly compressed matter for the RCD." @@ -832,18 +747,43 @@ RLD has_ammobar = FALSE /obj/item/construction/rcd/arcd/afterattack(atom/A, mob/user) - ..() if(!range_check(A,user)) return - if(target_check(A,user)) - user.Beam(A,icon_state="rped_upgrade",time=30) - rcd_create(A,user) - + return ..() +/obj/item/construction/rcd/exosuit + name = "mounted RCD" + desc = "You're not supposed to see this!" + max_matter = 1000 + matter = 0 // starts off empty, load materials into the mech itself + delay_mod = 0.5 + ranged = TRUE + has_ammobar = FALSE // don't bother, you can't see it + item_flags = NO_MAT_REDEMPTION | DROPDEL | NOBLUDGEON + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | UNACIDABLE // would be weird if it could somehow be destroyed inside the equipment item + +/obj/item/construction/rcd/exosuit/ui_state(mob/user) + return GLOB.pilot_state + +/obj/item/construction/rcd/exosuit/ui_status(mob/user) + if(!(owner && ismecha(owner))) + return UI_CLOSE + var/obj/mecha/gundam = owner + if(user != gundam.occupant) + return UI_CLOSE + if(!gundam.equipment_disabled && gundam.selected == loc) + return UI_INTERACTIVE + return UI_UPDATE + +/obj/item/construction/rcd/exosuit/mime + name = "silenced mounted RCD" + silent = TRUE // RAPID LIGHTING DEVICE - +#define GLOW_MODE 3 +#define LIGHT_MODE 2 +#define REMOVE_MODE 1 /obj/item/construction/rld name = "Rapid Lighting Device (RLD)" @@ -854,10 +794,12 @@ RLD righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' matter = 200 max_matter = 200 + slot_flags = ITEM_SLOT_BELT + ///it does not make sense why any of these should be installed + banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + var/matter_divisor = 35 var/mode = LIGHT_MODE - slot_flags = ITEM_SLOT_BELT - actions_types = list(/datum/action/item_action/pick_color) var/wallcost = 10 var/floorcost = 15 @@ -868,35 +810,62 @@ RLD var/floordelay = 10 var/decondelay = 15 -/obj/item/construction/rld/ui_action_click(mob/user, datum/action/A) - if(istype(A, /datum/action/item_action/pick_color)) - color_choice = input(user,"","Choose Color",color_choice) as color - else - ..() + ///reference to thr original icons + var/list/original_options = list( + "Color Pick" = icon(icon = 'icons/mob/radial.dmi', icon_state = "omni"), + "Glow Stick" = icon(icon = 'icons/obj/lighting.dmi', icon_state = "glowstick"), + "Deconstruct" = icon(icon = 'icons/obj/tools.dmi', icon_state = "wrench"), + "Light Fixture" = icon(icon = 'icons/obj/lighting.dmi', icon_state = "ltube"), + ) + ///will contain the original icons modified with the color choice + var/list/display_options = list() + +/obj/item/construction/rld/Initialize(mapload) + . = ..() + for(var/option in original_options) + display_options[option] = icon(original_options[option]) /obj/item/construction/rld/update_icon_state() . = ..() icon_state = "rld-[round(matter/35)]" /obj/item/construction/rld/attack_self(mob/user) - ..() - switch(mode) - if(REMOVE_MODE) + . = ..() + + if((upgrade & RCD_UPGRADE_SILO_LINK) && display_options["Silo Link"] == null) //silo upgrade instaled but option was not updated then update it just one + display_options["Silo Link"] = icon(icon = 'icons/obj/mining.dmi', icon_state = "silo") + var/choice = show_radial_menu(user, src, display_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + if(!choice) + return + + switch(choice) + if("Light Fixture") mode = LIGHT_MODE to_chat(user, span_notice("You change RLD's mode to 'Permanent Light Construction'.")) - if(LIGHT_MODE) + if("Glow Stick") mode = GLOW_MODE to_chat(user, span_notice("You change RLD's mode to 'Light Launcher'.")) - if(GLOW_MODE) + if("Color Pick") + var/new_choice = input(user,"","Choose Color",color_choice) as color + if(new_choice == null) + return + + var/list/new_rgb = ReadRGB(new_choice) + for(var/option in original_options) + if(option == "Color Pick" || option == "Deconstruct" || option == "Silo Link") + continue + var/icon/icon = icon(original_options[option]) + icon.SetIntensity(new_rgb[1]/255, new_rgb[2]/255, new_rgb[3]/255) //apply new scale + display_options[option] = icon + + color_choice = new_choice + if("Deconstruct") mode = REMOVE_MODE to_chat(user, span_notice("You change RLD's mode to 'Deconstruct'.")) - -/obj/item/construction/rcd/attackby(obj/item/I, mob/user, params) - ..() - if(upgrade & RCD_UPGRADE_CONVEYORS && istype(I, /obj/item/conveyor_switch_construct)) - to_chat(user, "You link the switch to the [src].") - var/obj/item/conveyor_switch_construct/C = I - linked_switch_id = C.id + else + ui_act("toggle_silo", list()) /obj/item/construction/rld/proc/checkdupes(target) . = list() @@ -917,7 +886,8 @@ RLD if(checkResource(deconcost, user)) to_chat(user, span_notice("You start deconstructing [A]...")) user.Beam(A,icon_state="nzcrentrs_power",time=15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + if(!silent) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, decondelay, A)) if(!useResource(deconcost, user)) return FALSE @@ -931,8 +901,9 @@ RLD if(checkResource(floorcost, user)) to_chat(user, span_notice("You start building a wall light...")) user.Beam(A,icon_state="nzcrentrs_power",time=15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, FALSE) + if(!silent) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, FALSE) if(do_after(user, floordelay, A)) if(!istype(W)) return FALSE @@ -946,7 +917,8 @@ RLD candidates += C if(!candidates.len) to_chat(user, span_warning("Valid target not found...")) - playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, TRUE) + if(!silent) + playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, TRUE) return FALSE for(var/turf/open/O in candidates) if(istype(O)) @@ -977,8 +949,9 @@ RLD if(checkResource(floorcost, user)) to_chat(user, span_notice("You start building a floor light...")) user.Beam(A,icon_state="light_beam",time=15) - playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, TRUE) + if(!silent) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, TRUE) if(do_after(user, floordelay, A)) if(!istype(F)) return 0 diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index a58fe204b090..12d3e9973540 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -241,6 +241,8 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( var/static/datum/pipe_info/first_plumbing var/mode = BUILD_MODE | PAINT_MODE | DESTROY_MODE | WRENCH_MODE var/locked = FALSE //wheter we can change categories. Useful for the plumber + /// The owner of this RCD. It can be a mech or a player. + var/owner /obj/item/pipe_dispenser/Initialize(mapload) . = ..() @@ -287,6 +289,9 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( get_asset_datum(/datum/asset/spritesheet/pipes), ) +/obj/item/pipe_dispenser/ui_host(mob/user) + return owner || ..() + /obj/item/pipe_dispenser/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -306,7 +311,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( "selected_color" = paint_color, "paint_colors" = GLOB.pipe_paint_colors, "mode" = mode, - "locked" = locked + "locked" = locked, ) var/list/recipes @@ -330,10 +335,10 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( return data /obj/item/pipe_dispenser/ui_act(action, params) - if(..()) - return - if(!usr.canUseTopic(src, BE_CLOSE)) + . = ..() + if(.) return + var/playeffect = TRUE switch(action) if("color") @@ -568,6 +573,24 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( return to_chat(source, span_notice("You set the layer to [piping_layer].")) +/obj/item/pipe_dispenser/exosuit + name = "mounted pipe dispenser" + desc = "You shouldn't be seeing this!" + item_flags = NO_MAT_REDEMPTION | DROPDEL | NOBLUDGEON + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | UNACIDABLE // would be weird if it could somehow be destroyed inside the equipment item + +/obj/item/pipe_dispenser/exosuit/ui_state(mob/user) + return GLOB.pilot_state + +// don't allow using this thing unless you're piloting the mech it's attached to +/obj/item/pipe_dispenser/exosuit/can_interact(mob/user) + if(!(owner && ismecha(owner))) + return FALSE + var/obj/mecha/gundam = owner + if(user == gundam.occupant && !gundam.equipment_disabled && gundam.selected == loc) + return TRUE + return FALSE + /obj/item/pipe_dispenser/plumbing name = "Plumberinator" desc = "A crude device to rapidly plumb things." diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm index d8f3fc908ca0..796735d2a727 100644 --- a/code/game/objects/items/airlock_painter.dm +++ b/code/game/objects/items/airlock_painter.dm @@ -439,7 +439,7 @@ * * target - The turf being painted to */ /obj/item/airlock_painter/decal/proc/paint_floor(turf/open/floor/target) - target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, alpha, color, null, FALSE, null) + target.AddElement(/datum/element/decal, 'icons/turf/decals.dmi', stored_decal_total, stored_dir, null, null, default_alpha, color, null, FALSE, null) /** * Return the final icon_state for the given decal options diff --git a/code/game/objects/items/bell.dm b/code/game/objects/items/bell.dm index 7bb200f82249..f3b1b1d30467 100644 --- a/code/game/objects/items/bell.dm +++ b/code/game/objects/items/bell.dm @@ -1,6 +1,6 @@ /obj/item/deskbell name = "desk bell" - desc = "ding. ding." + desc = "Ding! Ding! Ding!" icon = 'icons/obj/bell.dmi' icon_state = "bell" force = 5 diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 02320aed0c12..2f07409a68e0 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -561,6 +561,10 @@ update_label("John Doe", "Clowny") name = "[(!registered_name) ? "identification card" : "[registered_name]'s ID Card"][(!assignment) ? "" : " ([assignment])"]" +//a card that can't register a bank account IC +/obj/item/card/id/no_bank/AltClick(mob/living/user) + return FALSE + /obj/item/card/id/silver name = "silver identification card" desc = "A silver card which shows honour and dedication." @@ -584,6 +588,27 @@ update_label("John Doe", "Clowny") lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' +/obj/item/card/id/synthetic + name = "synthetic identification card" + desc = "An integrated card that allows synthetic units access across the station." + icon_state = "id_silver" + item_state = "silver_id" + lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' + item_flags = DROPDEL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/card/id/synthetic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SYNTHETIC_TRAIT) + +/obj/item/card/id/synthetic/GetAccess() + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.mind) + return GLOB.synthetic_base_access + GLOB.synthetic_added_access + return list() + /obj/item/card/id/syndicate name = "agent card" access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE) @@ -796,8 +821,8 @@ update_label("John Doe", "Clowny") var/obj/structure/fireaxecabinet/bridge/spare/holder = loc forceMove(holder.loc) holder.spareid = null - if(holder.obj_integrity > holder.integrity_failure) //we dont want to heal it by accident - holder.take_damage(holder.obj_integrity - holder.integrity_failure, BURN, armour_penetration = 100) //we do a bit of trolling for being naughty + if(holder.get_integrity() > holder.integrity_failure) //we dont want to heal it by accident + holder.take_damage(holder.get_integrity() - holder.integrity_failure, BURN, armour_penetration = 100) //we do a bit of trolling for being naughty else holder.update_appearance(UPDATE_ICON) //update the icon anyway so it pops out visible_message(span_danger("The heat of the temporary spare shatters the glass!")); diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 73763cfbb5f2..79aa6f428cae 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -6,15 +6,21 @@ /obj/item/circuitboard name = "circuit board" icon = 'icons/obj/module.dmi' - icon_state = "id_mod" + icon_state = "circuit_map" item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' materials = list(/datum/material/glass=1000) w_class = WEIGHT_CLASS_SMALL grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/gold = 10) + greyscale_colors = CIRCUIT_COLOR_GENERIC var/build_path = null +/obj/item/circuitboard/Initialize(mapload) + if(icon_state == "circuit_map") // some circuitboards have cool custom sprites + set_greyscale(new_config = /datum/greyscale_config/circuit) + return ..() + /obj/item/circuitboard/proc/apply_default_parts(obj/machinery/M) return diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index d29f7babb581..d2a196a1c8b3 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -2,12 +2,12 @@ /obj/item/circuitboard/computer/aiupload name = "AI Upload (Computer Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/upload/ai /obj/item/circuitboard/computer/borgupload name = "Cyborg Upload (Computer Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/upload/borg /obj/item/circuitboard/computer/bsa_control @@ -16,7 +16,7 @@ /obj/item/circuitboard/computer/card name = "ID Console (Computer Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/card /obj/item/circuitboard/computer/card/centcom @@ -42,30 +42,30 @@ /obj/item/circuitboard/computer/ai_ship name = "AI Ship Shuttle (Computer Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/computer/shuttle/ai_ship //obj/item/circuitboard/computer/shield // name = "Shield Control (Computer Board)" -// icon_state = "command" +// greyscale_colors = CIRCUIT_COLOR_COMMAND // build_path = /obj/machinery/computer/stationshield //Engineering /obj/item/circuitboard/computer/apc_control name = "\improper Power Flow Control Console (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/apc_control /obj/item/circuitboard/computer/atmos_alert name = "Atmospheric Alert (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/atmos_alert /obj/item/circuitboard/computer/atmos_control name = "Atmospheric Monitor (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/atmos_control /obj/item/circuitboard/computer/atmos_control/tank @@ -106,94 +106,94 @@ /obj/item/circuitboard/computer/auxiliary_base name = "Auxiliary Base Management Console (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/auxiliary_base /obj/item/circuitboard/computer/base_construction name = "circuit board (Aux Mining Base Construction Console)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/camera_advanced/base_construction /obj/item/circuitboard/computer/comm_monitor name = "Telecommunications Monitor (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/telecomms/monitor /obj/item/circuitboard/computer/comm_server name = "Telecommunications Server Monitor (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/telecomms/server /obj/item/circuitboard/computer/communications name = "Communications (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/communications /obj/item/circuitboard/computer/message_monitor name = "Message Monitor (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/message_monitor /obj/item/circuitboard/computer/powermonitor name = "Power Monitor (Computer Board)" //name fixed 250810 - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/monitor /obj/item/circuitboard/computer/powermonitor/secret name = "Outdated Power Monitor (Computer Board)" //Variant used on ruins to prevent them from showing up on PDA's. - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/monitor/secret /obj/item/circuitboard/computer/sat_control name = "Satellite Network Control (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/sat_control /obj/item/circuitboard/computer/solar_control name = "Solar Control (Computer Board)" //name fixed 250810 - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/solar_control /obj/item/circuitboard/computer/stationalert name = "Station Alerts (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/station_alert /obj/item/circuitboard/computer/teleporter name = "Teleporter (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/teleporter /obj/item/circuitboard/computer/turbine_computer name = "Turbine Computer (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/turbine_computer /obj/item/circuitboard/computer/turbine_control name = "Turbine control (Computer Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/computer/turbine_computer //Generic /obj/item/circuitboard/computer/arcade/amputation name = "Mediborg's Amputation Adventure (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/arcade/amputation /obj/item/circuitboard/computer/arcade/battle name = "Arcade Battle (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/arcade/battle /obj/item/circuitboard/computer/arcade/orion_trail name = "Orion Trail (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/arcade/orion_trail /obj/item/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future name = "Holodeck Control (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/holodeck /obj/item/circuitboard/computer/libraryconsole @@ -215,32 +215,32 @@ /obj/item/circuitboard/computer/monastery_shuttle name = "Monastery Shuttle (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/monastery_shuttle /obj/item/circuitboard/computer/olddoor name = "DoorMex (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod/old /obj/item/circuitboard/computer/pod name = "Massdriver control (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod /obj/item/circuitboard/computer/slot_machine name = "Slot Machine (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/slot_machine /obj/item/circuitboard/computer/swfdoor name = "Magix (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod/old/swf /obj/item/circuitboard/computer/syndicate_shuttle name = "Syndicate Shuttle (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/syndicate var/challenge = FALSE var/moved = FALSE @@ -255,12 +255,12 @@ /obj/item/circuitboard/computer/syndicatedoor name = "ProComp Executive (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/pod/old/syndicate /obj/item/circuitboard/computer/white_ship name = "White Ship (Computer Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/white_ship /obj/item/circuitboard/computer/white_ship/pod @@ -275,80 +275,80 @@ /obj/item/circuitboard/computer/cloning name = "Cloning (Computer Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/cloning /obj/item/circuitboard/computer/crew name = "Crew Monitoring Console (Computer Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/crew /obj/item/circuitboard/computer/med_data name = "Medical Records Console (Computer Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/med_data /obj/item/circuitboard/computer/operating name = "Operating Computer (Computer Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/operating /obj/item/circuitboard/computer/pandemic name = "PanD.E.M.I.C. 2200 (Computer Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/pandemic /obj/item/circuitboard/computer/prototype_cloning name = "Prototype Cloning (Computer Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/prototype_cloning /obj/item/circuitboard/computer/scan_consolenew name = "DNA Machine (Computer Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/computer/scan_consolenew //Science /obj/item/circuitboard/computer/aifixer name = "AI Integrity Restorer (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/aifixer /obj/item/circuitboard/computer/launchpad_console name = "Launchpad Control Console (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/launchpad /obj/item/circuitboard/computer/mech_bay_power_console name = "Mech Bay Power Control Console (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/mech_bay_power_console /obj/item/circuitboard/computer/mecha_control name = "Exosuit Control Console (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/mecha /obj/item/circuitboard/computer/nanite_chamber_control name = "Nanite Chamber Control (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/nanite_chamber_control /obj/item/circuitboard/computer/nanite_cloud_controller name = "Nanite Cloud Control (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/nanite_cloud_controller /obj/item/circuitboard/computer/rdconsole name = "R&D Console (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdconsole/core var/unlocked = FALSE /obj/item/circuitboard/computer/rdconsole/ruin name = "Experimental R&D Console (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdconsole/nolock/ruin /obj/item/circuitboard/computer/rdconsole/production @@ -402,22 +402,22 @@ /obj/item/circuitboard/computer/rdservercontrol name = "R&D Server Control (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/rdservercontrol /obj/item/circuitboard/computer/research name = "Research Monitor (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/security/research /obj/item/circuitboard/computer/robotics name = "Robotics Control (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/robotics /obj/item/circuitboard/computer/xenobiology name = "Xenobiology Console (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/camera_advanced/xenobio /obj/item/circuitboard/computer/xenobiology/syndicateicemoon @@ -432,71 +432,63 @@ name = "Shuttle Navigation Computer (Computer Board)" build_path = /obj/machinery/computer/camera_advanced/shuttle_docker/custom -/obj/item/circuitboard/computer/ai_upload_download - name = "AI Control Console (Computer Board)" - icon_state = "science" - build_path = /obj/machinery/computer/ai_control_console /obj/item/circuitboard/computer/ai_server_overview name = "AI Server Overview Console (Computer Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/ai_server_console -/obj/item/circuitboard/computer/ai_resource_distribution - name = "AI Resource Distribution Console (Computer Board)" - icon_state = "science" - build_path = /obj/machinery/computer/ai_resource_distribution //Security /obj/item/circuitboard/computer/labor_shuttle name = "Labor Shuttle (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/shuttle/labor /obj/item/circuitboard/computer/labor_shuttle/one_way name = "Prisoner Shuttle Console (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/shuttle/labor/one_way /obj/item/circuitboard/computer/gulag_teleporter_console name = "Labor Camp teleporter console (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/gulag_teleporter_computer /obj/item/circuitboard/computer/prisoner name = "Prisoner Management Console (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/prisoner /obj/item/circuitboard/computer/secure_data name = "Security Records Console (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/secure_data /obj/item/circuitboard/computer/warrant name = "Security Warrant Viewer (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/warrant /obj/item/circuitboard/computer/security name = "Security Cameras (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/security /obj/item/circuitboard/computer/security/labor name = "Labor Security Cameras (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/security/labor /obj/item/circuitboard/computer/security/hos name = "HOS Security Cameras (Computer Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/computer/security/hos /obj/item/circuitboard/computer/security/qm name = "QM Security Cameras (Computer Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/security/qm //Service @@ -505,12 +497,12 @@ /obj/item/circuitboard/computer/bounty name = "Nanotrasen Bounty Console (Computer Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/bounty /obj/item/circuitboard/computer/cargo name = "Supply Console (Computer Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/cargo var/contraband = FALSE @@ -553,21 +545,21 @@ /obj/item/circuitboard/computer/ferry name = "Transport Ferry (Computer Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/shuttle/ferry /obj/item/circuitboard/computer/ferry/request name = "Transport Ferry Console (Computer Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/shuttle/ferry/request /obj/item/circuitboard/computer/mining name = "Outpost Status Display (Computer Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/security/mining /obj/item/circuitboard/computer/mining_shuttle name = "Mining Shuttle (Computer Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/shuttle/mining diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index baf533a0496d..9f73965fa137 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -2,7 +2,7 @@ /obj/item/circuitboard/machine/bsa/back name = "Bluespace Artillery Generator (Machine Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/bsa/back //No freebies! req_components = list( /obj/item/stock_parts/capacitor/quadratic = 5, @@ -10,7 +10,7 @@ /obj/item/circuitboard/machine/bsa/front name = "Bluespace Artillery Bore (Machine Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/bsa/front req_components = list( /obj/item/stock_parts/manipulator/femto = 5, @@ -18,7 +18,7 @@ /obj/item/circuitboard/machine/bsa/middle name = "Bluespace Artillery Fusor (Machine Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/bsa/middle req_components = list( /obj/item/stack/ore/bluespace_crystal = 20, @@ -26,7 +26,7 @@ /obj/item/circuitboard/machine/dna_vault name = "DNA Vault (Machine Board)" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/dna_vault //No freebies! req_components = list( /obj/item/stock_parts/capacitor/super = 5, @@ -37,7 +37,7 @@ /obj/item/circuitboard/machine/announcement_system name = "Announcement System (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/announcement_system req_components = list( /obj/item/stack/cable_coil = 2, @@ -45,7 +45,7 @@ /obj/item/circuitboard/machine/igniter name = "Floor Igniter (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/igniter req_components = list( /obj/item/stack/cable_coil = 2, @@ -53,7 +53,7 @@ /obj/item/circuitboard/machine/autolathe name = "Autolathe (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/autolathe req_components = list( /obj/item/stock_parts/matter_bin = 3, @@ -62,7 +62,7 @@ /obj/item/circuitboard/machine/grounding_rod name = "Grounding Rod (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/grounding_rod req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE @@ -70,7 +70,7 @@ /obj/item/circuitboard/machine/telecomms/broadcaster name = "Subspace Broadcaster (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/broadcaster req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -81,7 +81,7 @@ /obj/item/circuitboard/machine/telecomms/bus name = "Bus Mainframe (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/bus req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -90,7 +90,7 @@ /obj/item/circuitboard/machine/telecomms/hub name = "Hub Mainframe (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/hub req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -99,7 +99,7 @@ /obj/item/circuitboard/machine/telecomms/message_server name = "Messaging Server (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/message_server req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -108,7 +108,7 @@ /obj/item/circuitboard/machine/telecomms/processor name = "Processor Unit (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/processor req_components = list( /obj/item/stock_parts/manipulator = 3, @@ -120,7 +120,7 @@ /obj/item/circuitboard/machine/telecomms/receiver name = "Subspace Receiver (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/receiver req_components = list( /obj/item/stock_parts/subspace/ansible = 1, @@ -130,7 +130,7 @@ /obj/item/circuitboard/machine/telecomms/relay name = "Relay Mainframe (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/relay req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -139,7 +139,7 @@ /obj/item/circuitboard/machine/telecomms/server name = "Telecommunication Server (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/telecomms/server req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -148,7 +148,7 @@ /obj/item/circuitboard/machine/tesla_coil name = "Tesla Controller (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING desc = "You can use a screwdriver to switch between Research and Power Generation." build_path = /obj/machinery/power/tesla_coil req_components = list(/obj/item/stock_parts/capacitor = 1) @@ -156,16 +156,25 @@ /obj/item/circuitboard/machine/suit_storage_unit name = "Suit Storage Unit (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/suit_storage_unit req_components = list( /obj/item/stock_parts/micro_laser = 5, /obj/item/stack/cable_coil = 2, /obj/item/stock_parts/manipulator = 5) +/obj/item/circuitboard/machine/synth_pod + name = "Synthetic Storage Unit (Machine Board)" + icon_state = "engineering" + build_path = /obj/machinery/synth_pod + req_components = list( + /obj/item/stock_parts/micro_laser = 2, + /obj/item/stack/cable_coil = 2, + /obj/item/stock_parts/manipulator = 2) + /obj/item/circuitboard/machine/decontamination_unit name = "Decontamination Storage Unit (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/decontamination_unit req_components = list( /obj/item/stock_parts/micro_laser = 5, @@ -214,20 +223,20 @@ /obj/item/circuitboard/machine/cell_charger name = "Cell Charger (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/cell_charger req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/circulator name = "Circulator/Heat Exchanger (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/binary/circulator req_components = list() /obj/item/circuitboard/machine/emitter name = "Emitter (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/emitter req_components = list( /obj/item/stock_parts/micro_laser = 1, @@ -241,13 +250,13 @@ /obj/item/circuitboard/machine/generator name = "Thermo-Electric Generator (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/generator req_components = list() /obj/item/circuitboard/machine/ntnet_relay name = "NTNet Relay (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/ntnet_relay req_components = list( /obj/item/stack/cable_coil = 2, @@ -255,7 +264,7 @@ /obj/item/circuitboard/machine/pacman name = "PACMAN-type Generator (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/port_gen/pacman req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -266,7 +275,7 @@ /obj/item/circuitboard/machine/pacman/super name = "SUPERPACMAN-type Generator (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/port_gen/pacman/super /obj/item/circuitboard/machine/pacman/mrs @@ -275,7 +284,7 @@ /obj/item/circuitboard/machine/power_compressor name = "Power Compressor (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/compressor req_components = list( /obj/item/stack/cable_coil = 5, @@ -283,7 +292,7 @@ /obj/item/circuitboard/machine/power_turbine name = "Power Turbine (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/turbine req_components = list( /obj/item/stack/cable_coil = 5, @@ -291,12 +300,12 @@ /obj/item/circuitboard/machine/protolathe/department/engineering name = "Departmental Protolathe (Machine Board) - Engineering" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/rnd/production/protolathe/department/engineering /obj/item/circuitboard/machine/rad_collector name = "Radiation Collector (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/rad_collector req_components = list( /obj/item/stack/cable_coil = 5, @@ -308,7 +317,7 @@ /obj/item/circuitboard/machine/rtg name = "RTG (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/rtg req_components = list( /obj/item/stack/cable_coil = 5, @@ -327,14 +336,14 @@ /obj/item/circuitboard/machine/scanner_gate name = "Scanner Gate (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/scanner_gate req_components = list( /obj/item/stock_parts/scanning_module = 3) /obj/item/circuitboard/machine/smes name = "SMES (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/power/smes req_components = list( /obj/item/stack/cable_coil = 5, @@ -348,7 +357,7 @@ /obj/item/circuitboard/machine/teleporter_hub name = "Teleporter Hub (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/teleport/hub req_components = list( /obj/item/stack/ore/bluespace_crystal = 3, @@ -357,7 +366,7 @@ /obj/item/circuitboard/machine/teleporter_station name = "Teleporter Station (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/teleport/station req_components = list( /obj/item/stack/ore/bluespace_crystal = 2, @@ -367,7 +376,7 @@ /obj/item/circuitboard/machine/thermomachine name = "Thermomachine (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer var/pipe_layer = PIPING_LAYER_DEFAULT req_components = list( @@ -380,14 +389,14 @@ . = ..() if(istype(I)) pipe_layer = (pipe_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (pipe_layer + 1) - to_chat(user, "You change the circuitboard to layer [pipe_layer].") + to_chat(user, span_notice("You change the circuitboard to layer [pipe_layer].")) /obj/item/circuitboard/machine/thermomachine/examine() . = ..() . += "It is set to layer [pipe_layer]." /obj/item/circuitboard/machine/crystallizer name = "Crystallizer (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/binary/crystallizer req_components = list( /obj/item/stack/cable_coil = 10, @@ -396,28 +405,28 @@ /obj/item/circuitboard/machine/HFR_fuel_input name = "HFR Fuel Input (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/fuel_input req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_waste_output name = "HFR Waste Output (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/waste_output req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_moderator_input name = "HFR Moderator Input (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/moderator_input req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_core name = "HFR core (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/atmospherics/components/unary/hypertorus/core req_components = list( /obj/item/stack/cable_coil = 10, @@ -426,14 +435,14 @@ /obj/item/circuitboard/machine/HFR_corner name = "HFR Corner (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/hypertorus/corner req_components = list( /obj/item/stack/sheet/plasteel = 5) /obj/item/circuitboard/machine/HFR_interface name = "HFR Interface (Machine Board)" - icon_state = "engineering" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING build_path = /obj/machinery/hypertorus/interface req_components = list( /obj/item/stack/cable_coil = 10, @@ -444,7 +453,7 @@ /obj/item/circuitboard/machine/circuit_imprinter name = "Circuit Imprinter (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/circuit_imprinter req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -453,12 +462,12 @@ /obj/item/circuitboard/machine/circuit_imprinter/department name = "Departmental Circuit Imprinter (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/circuit_imprinter/department /obj/item/circuitboard/machine/holopad name = "AI Holopad (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/holopad req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE //wew lad @@ -484,7 +493,7 @@ /obj/item/circuitboard/machine/launchpad name = "Bluespace Launchpad (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/launchpad req_components = list( /obj/item/stack/ore/bluespace_crystal = 1, @@ -493,7 +502,7 @@ /obj/item/circuitboard/machine/paystand name = "Pay Stand (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/paystand var/cash_register = FALSE req_components = list() @@ -513,7 +522,7 @@ /obj/item/circuitboard/machine/ticketmachine name = "Ticket Machine (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC desc = "You will also need a ticket machine remote to operate this." build_path = /obj/machinery/ticket_machine req_components = list( @@ -522,7 +531,7 @@ /obj/item/circuitboard/machine/inspector_booth name = "Inspector Booth (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/inspector_booth req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -533,7 +542,7 @@ /obj/item/circuitboard/machine/protolathe name = "Protolathe (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/protolathe req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -542,7 +551,7 @@ /obj/item/circuitboard/machine/protolathe name = "Protolathe (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/protolathe req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -551,17 +560,17 @@ /obj/item/circuitboard/machine/protolathe/department name = "Departmental Protolathe (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/protolathe/department /obj/item/circuitboard/machine/protolathe/department name = "Departmental Protolathe (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/protolathe/department /obj/item/circuitboard/machine/reagentgrinder name = "Machine Design (All-In-One Grinder)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/reagentgrinder/constructed req_components = list( /obj/item/stock_parts/manipulator = 1) @@ -602,7 +611,7 @@ /obj/item/circuitboard/machine/space_heater name = "Space Heater (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/space_heater req_components = list( /obj/item/stock_parts/micro_laser = 1, @@ -612,7 +621,7 @@ /obj/item/circuitboard/machine/techfab name = "\improper Techfab (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/rnd/production/techfab req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -704,6 +713,14 @@ /obj/item/stack/sheet/glass = 1, /obj/item/vending_refill/donksoft = 1) +/obj/item/circuitboard/machine/vending/donksofttoyvendor/hugbox + name = "Donksoft Toy Vendor Lite (Machine Board)" + desc = "This one seems somehow less fun than usual..." + build_path = /obj/machinery/vending/donksofttoyvendor/hugbox + req_components = list( + /obj/item/stack/sheet/glass = 1, + /obj/item/vending_refill/donksoft = 1) + /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor name = "Syndicate Donksoft Toy Vendor (Machine Board)" build_path = /obj/machinery/vending/toyliberationstation @@ -715,7 +732,7 @@ /obj/item/circuitboard/machine/chem_dispenser name = "Chem Dispenser (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/chem_dispenser req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -735,7 +752,7 @@ // yogs end /obj/item/circuitboard/machine/chem_heater name = "Chemical Heater (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/chem_heater req_components = list( /obj/item/stock_parts/micro_laser = 1, @@ -743,7 +760,7 @@ /obj/item/circuitboard/machine/chem_master name = "ChemMaster 3000 (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/chem_master desc = "You can turn the \"mode selection\" dial using a screwdriver." req_components = list( @@ -769,7 +786,7 @@ /obj/item/circuitboard/machine/clonepod name = "Clone Pod (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/clonepod req_components = list( /obj/item/stack/cable_coil = 2, @@ -780,12 +797,12 @@ /obj/item/circuitboard/machine/clonepod/experimental name = "Experimental Clone Pod (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/clonepod/experimental /obj/item/circuitboard/machine/clonescanner name = "Cloning Scanner (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/dna_scannernew req_components = list( /obj/item/stock_parts/scanning_module = 1, @@ -796,7 +813,7 @@ /obj/item/circuitboard/machine/cryo_tube name = "Cryotube (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/atmospherics/components/unary/cryo_cell req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -805,20 +822,20 @@ /obj/item/circuitboard/machine/fat_sucker name = "Lipid Extractor (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/fat_sucker req_components = list(/obj/item/stock_parts/micro_laser = 1, /obj/item/kitchen/fork = 1) /obj/item/circuitboard/machine/harvester name = "Harvester (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/harvester req_components = list(/obj/item/stock_parts/micro_laser = 4) /obj/item/circuitboard/machine/medical_kiosk name = "Medical Kiosk (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/medical_kiosk var/custom_cost = 10 req_components = list( @@ -842,7 +859,7 @@ /obj/item/circuitboard/machine/limbgrower name = "Limb Grower (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/limbgrower req_components = list( /obj/item/stock_parts/manipulator = 1, @@ -851,12 +868,12 @@ /obj/item/circuitboard/machine/protolathe/department/medical name = "Departmental Protolathe (Machine Board) - Medical" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/rnd/production/protolathe/department/medical /obj/item/circuitboard/machine/sleeper name = "Sleeper (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/sleeper req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -875,7 +892,7 @@ // yogs end /obj/item/circuitboard/machine/smoke_machine name = "Smoke Machine (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/smoke_machine req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -887,7 +904,7 @@ /obj/item/circuitboard/machine/stasis name = "Lifeform Stasis Unit (Machine Board)" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/stasis req_components = list( /obj/item/stack/cable_coil = 3, @@ -896,7 +913,7 @@ /obj/item/circuitboard/machine/techfab/department/medical name = "\improper Departmental Techfab (Machine Board) - Medical" - icon_state = "medical" + greyscale_colors = CIRCUIT_COLOR_MEDICAL build_path = /obj/machinery/rnd/production/techfab/department/medical /obj/item/circuitboard/machine/mindmachine_hub @@ -922,17 +939,17 @@ /obj/item/circuitboard/machine/circuit_imprinter/department/science name = "Departmental Circuit Imprinter - Science (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/circuit_imprinter/department/science /obj/item/circuitboard/machine/circuit_imprinter/department/netmin name = "Departmental Circuit Imprinter - Netmin (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/circuit_imprinter/department/netmin /obj/item/circuitboard/machine/cyborgrecharger name = "Cyborg Recharger (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/recharge_station req_components = list( /obj/item/stock_parts/capacitor = 2, @@ -942,7 +959,7 @@ /obj/item/circuitboard/machine/destructive_analyzer name = "Destructive Analyzer (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/destructive_analyzer req_components = list( /obj/item/stock_parts/scanning_module = 1, @@ -951,7 +968,7 @@ /obj/item/circuitboard/machine/experimentor name = "E.X.P.E.R.I-MENTOR (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/experimentor req_components = list( /obj/item/stock_parts/scanning_module = 1, @@ -960,7 +977,7 @@ /obj/item/circuitboard/machine/mech_recharger name = "Mechbay Recharger (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/mech_bay_recharge_port req_components = list( /obj/item/stack/cable_coil = 2, @@ -968,7 +985,7 @@ /obj/item/circuitboard/machine/mechfab name = "Exosuit Fabricator (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/mecha_part_fabricator req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -978,7 +995,7 @@ /obj/item/circuitboard/machine/monkey_recycler name = "Monkey Recycler (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/monkey_recycler req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -987,7 +1004,7 @@ /obj/item/circuitboard/machine/nanite_chamber name = "Nanite Chamber (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/nanite_chamber req_components = list( /obj/item/stock_parts/scanning_module = 2, @@ -996,7 +1013,7 @@ /obj/item/circuitboard/machine/nanite_program_hub name = "Nanite Program Hub (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/nanite_program_hub req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -1004,7 +1021,7 @@ /obj/item/circuitboard/machine/nanite_programmer name = "Nanite Programmer (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/nanite_programmer req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -1013,17 +1030,17 @@ /obj/item/circuitboard/machine/processor/slime name = "Slime Processor (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/processor/slime /obj/item/circuitboard/machine/protolathe/department/science name = "Departmental Protolathe (Machine Board) - Science" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/protolathe/department/science /obj/item/circuitboard/machine/public_nanite_chamber name = "Public Nanite Chamber (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/public_nanite_chamber var/cloud_id = 1 req_components = list( @@ -1044,7 +1061,7 @@ /obj/item/circuitboard/machine/quantumpad name = "Quantum Pad (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/quantumpad req_components = list( /obj/item/stack/ore/bluespace_crystal = 1, @@ -1055,7 +1072,7 @@ /obj/item/circuitboard/machine/rdserver name = "R&D Server (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/server req_components = list( /obj/item/stack/cable_coil = 2, @@ -1063,12 +1080,12 @@ /obj/item/circuitboard/machine/techfab/department/science name = "\improper Departmental Techfab (Machine Board) - Science" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/techfab/department/science /obj/item/circuitboard/machine/server_cabinet name = "Server Cabinet (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/ai/server_cabinet req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -1076,14 +1093,35 @@ /obj/item/stack/sheet/glass = 2, /obj/item/stack/cable_coil = 1) +/obj/item/circuitboard/machine/networking_machine + name = "Networking Machine (Machine Board)" + icon_state = "science" + build_path = /obj/machinery/ai/networking + req_components = list( + /obj/item/stock_parts/matter_bin = 4, + /obj/item/stock_parts/capacitor = 2, + /obj/item/stock_parts/scanning_module = 4, + /obj/item/stack/sheet/glass = 4, + /obj/item/stack/cable_coil = 1) + +/obj/item/circuitboard/machine/subcontroller + name = "Subcontroller (Machine Board)" + icon_state = "science" + build_path = /obj/machinery/ai/master_subcontroller + req_components = list( + /obj/item/stock_parts/capacitor = 4, + /obj/item/stock_parts/scanning_module = 4, + /obj/item/stack/sheet/glass = 2, + /obj/item/stack/cable_coil = 1) + /obj/item/circuitboard/machine/ai_core_display name = "AI Core Display (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/status_display/ai_core /obj/item/circuitboard/machine/ai_data_core name = "AI Data Core (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/ai/data_core req_components = list( /obj/item/stock_parts/capacitor = 4, @@ -1094,7 +1132,7 @@ /obj/item/circuitboard/machine/rack_creator name = "Rack Creator (Machine Board)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rack_creator req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -1102,7 +1140,7 @@ /obj/item/circuitboard/machine/plort name = "Machine Design (Plort Redemption Machine)" - icon_state = "science" + greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/plortrefinery req_components = list( /obj/item/stock_parts/manipulator = 3, @@ -1112,31 +1150,31 @@ /obj/item/circuitboard/machine/protolathe/department/security name = "Departmental Protolathe (Machine Board) - Security" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/rnd/production/protolathe/department/security /obj/item/circuitboard/machine/recharger name = "Weapon Recharger (Machine Board)" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/recharger req_components = list(/obj/item/stock_parts/capacitor = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/techfab/department/security name = "\improper Departmental Techfab (Machine Board) - Security" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/rnd/production/techfab/department/security /obj/item/circuitboard/machine/techfab/department/armory name = "\improper Departmental Techfab (Machine Board) - Armory" - icon_state = "security" + greyscale_colors = CIRCUIT_COLOR_SECURITY build_path = /obj/machinery/rnd/production/techfab/department/armory //Service /obj/item/circuitboard/machine/biogenerator name = "Biogenerator (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/biogenerator req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -1146,43 +1184,43 @@ /obj/item/circuitboard/machine/chem_dispenser/drinks name = "Soda Dispenser (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/chem_dispenser/drinks /obj/item/circuitboard/machine/chem_dispenser/drinks/beer name = "Booze Dispenser (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/chem_dispenser/drinks/beer /obj/item/circuitboard/machine/chem_master/condi name = "CondiMaster 3000 (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/chem_master/condimaster /obj/item/circuitboard/machine/deep_fryer name = "Deep Fryer (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/deepfryer req_components = list(/obj/item/stock_parts/micro_laser = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/griddle name = "Griddle (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/griddle req_components = list(/obj/item/stock_parts/micro_laser = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/oven name = "Oven (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/oven req_components = list(/obj/item/stock_parts/micro_laser = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/dish_drive name = "Dish Drive (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/dish_drive req_components = list( /obj/item/stack/sheet/glass = 1, @@ -1209,7 +1247,7 @@ /obj/item/circuitboard/machine/gibber name = "Gibber (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/gibber req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -1218,7 +1256,7 @@ /obj/item/circuitboard/machine/hydroponics name = "Hydroponics Tray (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/hydroponics/constructable req_components = list( /obj/item/stock_parts/matter_bin = 2, @@ -1228,7 +1266,7 @@ /obj/item/circuitboard/machine/microwave name = "Microwave (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/microwave req_components = list( /obj/item/stock_parts/micro_laser = 1, @@ -1239,7 +1277,7 @@ /obj/item/circuitboard/machine/plantgenes name = "Plant DNA Manipulator (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/plantgenes req_components = list( /obj/item/stock_parts/manipulator = 1, @@ -1249,7 +1287,7 @@ /obj/item/circuitboard/machine/processor name = "Food Processor (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/processor req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -1271,12 +1309,12 @@ /obj/item/circuitboard/machine/protolathe/department/service name = "Departmental Protolathe - Service (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/rnd/production/protolathe/department/service /obj/item/circuitboard/machine/recycler name = "Recycler (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/recycler req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -1285,7 +1323,7 @@ /obj/item/circuitboard/machine/seed_extractor name = "Seed Extractor (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/seed_extractor req_components = list( /obj/item/stock_parts/matter_bin = 1, @@ -1294,14 +1332,14 @@ /obj/item/circuitboard/machine/techfab/department/service name = "\improper Departmental Techfab - Service (Machine Board)" - icon_state = "service" + greyscale_colors = CIRCUIT_COLOR_SERVICE build_path = /obj/machinery/rnd/production/techfab/department/service //Supply /obj/item/circuitboard/machine/mining_equipment_vendor name = "Mining Equipment Vendor (Machine Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/equipment_vendor req_components = list( /obj/item/stack/sheet/glass = 1, @@ -1313,7 +1351,7 @@ /obj/item/circuitboard/machine/ore_redemption name = "Ore Redemption (Machine Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/ore_redemption req_components = list( /obj/item/stack/sheet/glass = 1, @@ -1325,18 +1363,18 @@ /obj/item/circuitboard/machine/ore_silo name = "Ore Silo (Machine Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/ore_silo req_components = list() /obj/item/circuitboard/machine/protolathe/department/cargo name = "Departmental Protolathe (Machine Board) - Cargo" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/rnd/production/protolathe/department/cargo /obj/item/circuitboard/machine/stacking_machine name = "Stacking Machine (Machine Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/stacking_machine req_components = list( /obj/item/stock_parts/manipulator = 2, @@ -1344,7 +1382,7 @@ /obj/item/circuitboard/machine/stacking_unit_console name = "Stacking Machine Console (Machine Board)" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/mineral/stacking_unit_console req_components = list( /obj/item/stack/sheet/glass = 2, @@ -1352,7 +1390,7 @@ /obj/item/circuitboard/machine/techfab/department/cargo name = "\improper Departmental Techfab (Machine Board) - Cargo" - icon_state = "supply" + greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/rnd/production/techfab/department/cargo //Misc @@ -1388,7 +1426,7 @@ /obj/item/circuitboard/machine/electrolyzer name = "Electrolyzer (Machine Board)" - icon_state = "generic" + greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/electrolyzer req_components = list( /obj/item/stock_parts/micro_laser = 2, diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index f9f286a1dcc8..9f89ac1a8651 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -41,7 +41,7 @@ /obj/structure/checkoutmachine/examine(mob/living/user) . = ..() - . += span_info("Its integrated integrity meter reads: HEALTH: [obj_integrity].") + . += span_info("Its integrated integrity meter reads: HEALTH: [atom_integrity].") /obj/structure/checkoutmachine/proc/check_if_finished() for(var/i in accounts_to_rob) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index edd624f642e3..6e9311739504 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -28,8 +28,8 @@ GLOBAL_LIST_EMPTY(PDAs) /obj/item/pda - name = "\improper PDA" - desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge." + name = "\improper antique PDA" + desc = "An outdated, portable microcomputer developed by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge." icon = 'icons/obj/pda.dmi' icon_state = "pda" item_state = "electronic" @@ -174,7 +174,7 @@ GLOBAL_LIST_EMPTY(PDAs) inserted_item = null /obj/item/pda/proc/update_label() - name = "PDA-[owner] ([ownjob])" //Name generalisation + name = "\improper antique PDA-[owner] ([ownjob])" //Name generalisation /obj/item/pda/GetAccess() if(id) diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 59f2a180b750..3294e545717a 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -1,10 +1,10 @@ //Clown PDA is slippery. /obj/item/pda/clown - name = "clown PDA" + name = "\improper antique clown PDA" default_cartridge = /obj/item/cartridge/virus/clown insert_type = /obj/item/toy/crayon/rainbow icon_state = "pda-clown" - desc = "A portable microcomputer by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings." + desc = "An outdated, portable microcomputer developed by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings." ttone = "honk" /obj/item/pda/clown/Initialize(mapload) @@ -36,49 +36,49 @@ RegisterSignal(src, COMSIG_TABLET_CHECK_DETONATE, PROC_REF(pda_no_detonate)) /obj/item/pda/medical - name = "medical PDA" + name = "\improper antique medical PDA" default_cartridge = /obj/item/cartridge/medical icon_state = "pda-medical" /obj/item/pda/viro - name = "virology PDA" + name = "\improper antique virology PDA" default_cartridge = /obj/item/cartridge/medical icon_state = "pda-virology" /obj/item/pda/engineering - name = "engineering PDA" + name = "\improper antique engineering PDA" default_cartridge = /obj/item/cartridge/engineering icon_state = "pda-engineer" /obj/item/pda/security - name = "security PDA" + name = "\improper antique security PDA" default_cartridge = /obj/item/cartridge/security icon_state = "pda-security" /obj/item/pda/detective - name = "detective PDA" + name = "\improper antique detective PDA" default_cartridge = /obj/item/cartridge/detective icon_state = "pda-detective" /obj/item/pda/warden - name = "warden PDA" + name = "\improper antique warden PDA" default_cartridge = /obj/item/cartridge/security icon_state = "pda-warden" /obj/item/pda/janitor - name = "janitor PDA" + name = "\improper antique janitor PDA" default_cartridge = /obj/item/cartridge/janitor icon_state = "pda-janitor" ttone = "slip" /obj/item/pda/toxins - name = "scientist PDA" + name = "\improper antique scientist PDA" default_cartridge = /obj/item/cartridge/signal/toxins icon_state = "pda-science" ttone = "boom" /obj/item/pda/mime - name = "mime PDA" + name = "\improper antique mime PDA" default_cartridge = /obj/item/cartridge/virus/mime insert_type = /obj/item/toy/crayon/mime icon_state = "pda-mime" @@ -90,33 +90,33 @@ icon_state = "pda-hop" /obj/item/pda/heads/hop - name = "head of personnel PDA" + name = "\improper antique head of personnel PDA" default_cartridge = /obj/item/cartridge/hop icon_state = "pda-hop" /obj/item/pda/heads/hos - name = "head of security PDA" + name = "\improper antique head of security PDA" default_cartridge = /obj/item/cartridge/hos icon_state = "pda-hos" /obj/item/pda/heads/ce - name = "chief engineer PDA" + name = "\improper antique chief engineer PDA" default_cartridge = /obj/item/cartridge/ce icon_state = "pda-ce" /obj/item/pda/heads/cmo - name = "chief medical officer PDA" + name = "\improper antique chief medical officer PDA" default_cartridge = /obj/item/cartridge/cmo icon_state = "pda-cmo" /obj/item/pda/heads/rd - name = "research director PDA" + name = "\improper antique research director PDA" default_cartridge = /obj/item/cartridge/rd insert_type = /obj/item/pen/fountain icon_state = "pda-rd" /obj/item/pda/captain - name = "captain PDA" + name = "\improper antique captain PDA" default_cartridge = /obj/item/cartridge/captain insert_type = /obj/item/pen/fountain/captain icon_state = "pda-captain" @@ -126,90 +126,90 @@ RegisterSignal(src, COMSIG_TABLET_CHECK_DETONATE, PROC_REF(pda_no_detonate)) /obj/item/pda/cargo - name = "cargo technician PDA" + name = "\improper antique cargo technician PDA" default_cartridge = /obj/item/cartridge/quartermaster icon_state = "pda-cargo" /obj/item/pda/quartermaster - name = "quartermaster PDA" + name = "\improper antique quartermaster PDA" default_cartridge = /obj/item/cartridge/quartermaster insert_type = /obj/item/pen/fountain icon_state = "pda-qm" /obj/item/pda/shaftminer - name = "shaft miner PDA" + name = "\improper antique shaft miner PDA" icon_state = "pda-miner" /obj/item/pda/syndicate default_cartridge = /obj/item/cartridge/virus/syndicate icon_state = "pda-syndi" - name = "military PDA" + name = "\improper antique military PDA" owner = "John Doe" hidden = 1 /obj/item/pda/chaplain - name = "chaplain PDA" + name = "\improper antique chaplain PDA" icon_state = "pda-chaplain" ttone = "holy" /obj/item/pda/lawyer - name = "lawyer PDA" + name = "\improper antique lawyer PDA" default_cartridge = /obj/item/cartridge/lawyer insert_type = /obj/item/pen/fountain icon_state = "pda-lawyer" ttone = "objection" /obj/item/pda/botanist - name = "botanist PDA" + name = "\improper antique botanist PDA" //default_cartridge = /obj/item/cartridge/botanist icon_state = "pda-hydro" /obj/item/pda/roboticist - name = "roboticist PDA" + name = "\improper antique roboticist PDA" icon_state = "pda-roboticist" default_cartridge = /obj/item/cartridge/roboticist /obj/item/pda/curator - name = "curator PDA" + name = "\improper antique curator PDA" icon_state = "pda-library" icon_alert = "pda-r-library" default_cartridge = /obj/item/cartridge/curator insert_type = /obj/item/pen/fountain - desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a WGW-11 series e-reader." + desc = "An outdated, portable microcomputer developed by Thinktronic Systems, LTD. This model is a WGW-11 series e-reader." note = "Congratulations, your station has chosen the Thinktronic 5290 WGW-11 Series E-reader and Personal Data Assistant!" silent = TRUE //Quiet in the library! overlays_x_offset = -3 /obj/item/pda/clear - name = "clear PDA" + name = "\improper antique clear PDA" icon_state = "pda-clear" - desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a special edition with a transparent case." + desc = "An outdated, portable microcomputer developed by Thinktronic Systems, LTD. This model is a special edition with a transparent case." note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition!" /obj/item/pda/artist - name = "aesthetic PDA" + name = "\improper antique aesthetic PDA" icon_state = "pda-artist" /obj/item/pda/cook - name = "cook PDA" + name = "\improper antique cook PDA" icon_state = "pda-cook" /obj/item/pda/bar - name = "bartender PDA" + name = "\improper antique bartender PDA" icon_state = "pda-bartender" insert_type = /obj/item/pen/fountain /obj/item/pda/atmos - name = "atmospherics PDA" + name = "\improper antique atmospherics PDA" default_cartridge = /obj/item/cartridge/atmos icon_state = "pda-atmos" /obj/item/pda/chemist - name = "chemist PDA" + name = "\improper antique chemist PDA" default_cartridge = /obj/item/cartridge/chemistry icon_state = "pda-chemistry" /obj/item/pda/geneticist - name = "geneticist PDA" + name = "\improper antique geneticist PDA" default_cartridge = /obj/item/cartridge/medical icon_state = "pda-genetics" diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 6203c7ce1c86..1c2132a8e3a3 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -17,7 +17,7 @@ /obj/item/cartridge name = "generic cartridge" - desc = "A data cartridge for portable microcomputers." + desc = "A data cartridge for those old portable microcomputers." icon = 'icons/obj/pda.dmi' icon_state = "cart" item_state = "electronic" diff --git a/code/game/objects/items/devices/busterarm/busterharpoon.dm b/code/game/objects/items/devices/busterarm/busterharpoon.dm new file mode 100644 index 000000000000..31a2a43f6ba6 --- /dev/null +++ b/code/game/objects/items/devices/busterarm/busterharpoon.dm @@ -0,0 +1,108 @@ +/datum/action/cooldown/buster/megabuster/megaharpoon + name = "gasharpoon" + desc = "Charge up your harpoon and ready it to be fired, if it makes contact with a person it will drag them to you and immobilize them." + cooldown_time = 10 SECONDS + button_icon_state = "harpoonhead" + + +/obj/item/gun/magic/wire/harpoon + name = "Harpoon Head" + desc = "A harpoon head made of pure plasteel, hits like a freighter." + ammo_type = /obj/item/ammo_casing/magic/wire/harpoon + icon_state = "gasharpoon" + item_state = "chain" + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + fire_sound = 'sound/weapons/batonextend.ogg' + max_charges = 1 + item_flags = NEEDS_PERMIT | DROPDEL + force = 0 + can_charge = FALSE + +/obj/item/ammo_casing/magic/wire/harpoon + name = "harpoon" + desc = "A harpoon." + projectile_type = /obj/projectile/wire/harpoon + caliber = CALIBER_HOOK + icon_state = "harpoonhead" + +/obj/projectile/wire/harpoon/fire(setAngle) + if(firer) + wire = firer.Beam(src, icon_state = "harpoonrope", time = INFINITY, maxdistance = INFINITY) + ..() + +/obj/projectile/wire/harpoon + name = "harpoon" + icon_state = "harpoonhead" + icon = 'icons/obj/lavaland/artefacts.dmi' + pass_flags = PASSTABLE + damage = 10 + armour_penetration = 100 + damage_type = BRUTE + nodamage = TRUE + range = 8 + hitsound = 'sound/effects/splat.ogg' + immobilize = 1 SECONDS + +/obj/projectile/wire/harpoon/on_hit(atom/target) + var/mob/living/L = target + var/mob/living/carbon/human/H = firer + if(!L) + return + L.apply_status_effect(STATUS_EFFECT_EXPOSED_HARPOONED) + if(isobj(target)) // If it's an object + var/obj/item/I = target + if(!I?.anchored) // Give it to us if it's not anchored + I.throw_at(get_step_towards(H,I), 8, 2) + H.visible_message(span_danger("[I] is pulled by [H]'s harpoon!")) + if(istype(I, /obj/item/clothing/head)) + H.equip_to_slot_if_possible(I, ITEM_SLOT_HEAD) + H.visible_message(span_danger("[H] pulls [I] onto [H.p_their()] head!")) + else + H.put_in_hands(I) + return + zip(H, target) // Pull us towards it if it's anchored + if(isliving(target)) // If it's somebody + H.swap_hand(0) //for the sake of throttling people you catch + var/turf/T = get_step(get_turf(H), H.dir) + var/turf/Q = get_turf(H) + var/obj/item/bodypart/limb_to_hit = L.get_bodypart(H.zone_selected) + var/armor = L.run_armor_check(limb_to_hit, MELEE, armour_penetration = 35) + if(!L.anchored) // Only pull them if they're unanchored + if(istype(H)) + L.visible_message(span_danger("[L] is pulled by [H]'s harpoon!"),span_userdanger("A harpoon pierces you and pulls you towards [H]!")) + L.Immobilize(1.0 SECONDS) + if(T.density) // If we happen to be facing a wall after the wire snatches them + to_chat(H, span_warning("[H] catches [L] and throws [L.p_them()] against [T]!")) + to_chat(L, span_userdanger("[H] crushes you against [T]!")) + playsound(L,'sound/effects/pop_expl.ogg', 130, 1) + L.apply_damage(15, BRUTE, limb_to_hit, armor, wound_bonus=CANT_WOUND) + L.forceMove(Q) + return + // If we happen to be facing a dense object after the wire snatches them, like a table or window + for(var/obj/D in T.contents) + if(D.density == TRUE) + D.take_damage(50) + L.apply_damage(15, BRUTE, limb_to_hit, armor, wound_bonus=CANT_WOUND) + L.forceMove(Q) + to_chat(H, span_warning("[H] catches [L] throws [L.p_them()] against [D]!")) + playsound(L,'sound/effects/pop_expl.ogg', 20, 1) + return + L.forceMove(T) + if(iswallturf(target)) // If we hit a wall, pull us to it + var/turf/W = target + zip(H, W) + +/// Left buster-arm means megabuster goes in left hand -- I stole this from megabuster! -- cowbot93 +/datum/action/cooldown/buster/megabuster/megaharpoon/l/Activate() + var/obj/item/gun/magic/wire/harpoon/B = new() + owner.visible_message(span_userdanger("[owner]'s arm lets out a harrowing sound!")) + playsound(owner,'sound/weapons/bladeslice.ogg', 60, 1) + if(do_after(owner, 2 SECONDS, owner, timed_action_flags = IGNORE_USER_LOC_CHANGE)) + if(!owner.put_in_l_hand(B)) + to_chat(owner, span_warning("You can't do this with your left hand full!")) + else + owner.visible_message(span_danger("[owner]'s readies the harpoon to fire!")) + if(owner.active_hand_index % 2 == 0) + owner.swap_hand(0) + StartCooldown() diff --git a/code/game/objects/items/devices/busterarm/gasharpoon.dm b/code/game/objects/items/devices/busterarm/gasharpoon.dm new file mode 100644 index 000000000000..2889422101a0 --- /dev/null +++ b/code/game/objects/items/devices/busterarm/gasharpoon.dm @@ -0,0 +1,59 @@ +/obj/item/clothing/gloves/gasharpoon + name = "gasharpoon" + desc = "A metal gauntlet with a harpoon attatched, powered by gasoline and traditionally used by space-whalers." + ///reminder to channge all this -- I changed it :) + icon = 'icons/obj/traitor.dmi' + icon_state = "gasharpoon" + item_state = "gasharpoon" + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + attack_verb = list("harpooned", "gouged", "pierced") + force = 10 + throwforce = 10 + throw_range = 7 + strip_delay = 15 SECONDS + cold_protection = HANDS + heat_protection = HANDS + w_class = WEIGHT_CLASS_NORMAL + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, ELECTRIC = 100) + resistance_flags = FIRE_PROOF | ACID_PROOF + var/click_delay = 1.5 + + +/obj/item/clothing/gloves/gasharpoon/equipped(mob/user, slot) + . = ..() + if(slot & ITEM_SLOT_GLOVES) + RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(power_harpoon)) + var/datum/action/cooldown/buster/megabuster/megaharpoon/l/harpoon = new(user) + harpoon.Grant(user) + +/obj/item/clothing/gloves/gasharpoon/dropped(mob/user) + . = ..() + if(user.get_item_by_slot(ITEM_SLOT_GLOVES)==src) + UnregisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) + var/datum/action/cooldown/buster/megabuster/megaharpoon/l/harpoon = locate(/datum/action/cooldown/buster/megabuster/megaharpoon/l) in user.actions + if(harpoon) + harpoon.Remove(user) + return ..() + + +/obj/item/clothing/gloves/gasharpoon/proc/power_harpoon(mob/living/user, atom/movable/target) + if(!user || user.a_intent!=INTENT_HARM || (!isliving(target) && !isobj(target)) || isitem(target)) + return + do_attack(user, target, force * 2) + playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1) + target.visible_message(span_danger("[user]'s gasharpoon pierces through [target.name]!")) + return COMPONENT_NO_ATTACK_HAND + +/obj/item/clothing/gloves/gasharpoon/attack(mob/living/target, mob/living/user) + power_harpoon(user, target) + +/obj/item/clothing/gloves/gasharpoon/proc/do_attack(mob/living/user, atom/target, punch_force) + if(isliving(target)) + var/mob/living/target_mob = target + target_mob.apply_damage(punch_force, BRUTE, wound_bonus = 30) + else if(isobj(target)) + var/obj/target_obj = target + target_obj.take_damage(punch_force, BRUTE, MELEE, FALSE) + user.do_attack_animation(target, ATTACK_EFFECT_SLASH) + user.changeNext_move(CLICK_CD_MELEE * click_delay) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 0ca05a5c32af..dd31e5b34328 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -492,6 +492,13 @@ light_range = 6 // luminosity when on light_system = MOVABLE_LIGHT +/obj/item/flashlight/lantern/pinapolantern + name = "pinap-o'-lantern" + desc = "It's a pineapple." + icon = 'yogstation/icons/obj/items.dmi' + icon_state = "pinapolantern" + item_state = "pinapolantern" + /obj/item/flashlight/lantern/heirloom_moth name = "old lantern" desc = "An old lantern that has seen plenty of use." diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index bd43da8ef7e8..95a0a72e29b5 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -124,6 +124,17 @@ icon_state = "srv_cypherkey" channels = list(RADIO_CHANNEL_SERVICE = 1) +/obj/item/encryptionkey/headset_synthetic + name = "synthetic radio encryption key" + icon_state = "rd_cypherkey" + channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1) + translate_binary = TRUE + item_flags = DROPDEL + +/obj/item/encryptionkey/headset_synthetic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SYNTHETIC_TRAIT) + /obj/item/encryptionkey/headset_cent name = "\improper CentCom radio encryption key" icon_state = "cent_cypherkey" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index e1159a7dce30..c7906d086a7a 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -204,6 +204,23 @@ icon_state = "srv_headset" keyslot = new /obj/item/encryptionkey/headset_service +/obj/item/radio/headset/headset_synthetic + name = "synthetic radio headset" + desc = "Headset used by the onboard synthetic units. This one is integrated directly into the unit and is not possible to remove." + icon_state = "com_headset" + keyslot = new /obj/item/encryptionkey/headset_synthetic + item_flags = DROPDEL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/radio/headset/headset_synthetic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SYNTHETIC_TRAIT) + ADD_TRAIT(src, TRAIT_EMPPROOF_CONTENTS, SYNTHETIC_TRAIT) + ADD_TRAIT(src, TRAIT_EMPPROOF_SELF, SYNTHETIC_TRAIT) + +/obj/item/radio/headset/headset_synthetic/attackby(obj/item/W, mob/user, params) + return FALSE + /obj/item/radio/headset/headset_cent name = "\improper CentCom headset" desc = "A headset used by the upper echelons of Nanotrasen." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index cb5027fa300c..37dd346099a7 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -302,7 +302,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( // Okay, the signal was never processed, send a mundane broadcast. signal.data["compression"] = 0 signal.transmission_method = TRANSMISSION_RADIO - signal.levels = list(T.z) + signal.levels = SSmapping.get_connected_levels(T) signal.broadcast() /obj/item/radio/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index 30075a439631..1988bcc2512b 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -7,7 +7,6 @@ flags_1 = CONDUCT_1 resistance_flags = FIRE_PROOF | UNACIDABLE w_class = WEIGHT_CLASS_NORMAL - obj_integrity = 300 max_integrity = 300 item_state = "reverse_bear_trap" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 7a195a99be79..11e82c572af3 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -14,6 +14,13 @@ var/valve_open = FALSE var/toggle = TRUE +/obj/item/transfer_valve/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/item/transfer_valve/Destroy() attached_device = null return ..() @@ -70,8 +77,7 @@ if(attached_device) attached_device.on_found(finder) -/obj/item/transfer_valve/Crossed(atom/movable/AM as mob|obj) - . = ..() +/obj/item/transfer_valve/proc/on_entered(datum/source, atom/movable/AM, ...) if(attached_device) attached_device.Crossed(AM) diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 2ec72419d8d2..be60945b4233 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -371,14 +371,6 @@ name = "\improper DNA injector (Anti-Paranoia)" remove_mutations = list(PARANOIA) -/obj/item/dnainjector/mindread - name = "\improper DNA injector (Mindread)" - add_mutations = list(MINDREAD) - -/obj/item/dnainjector/antimindread - name = "\improper DNA injector (Anti-Mindread)" - remove_mutations = list(MINDREAD) - /obj/item/dnainjector/radioactive name = "\improper DNA injector (Radioactive)" add_mutations = list(RADIOACTIVE) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 267803160ba5..44f789bb8735 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -89,7 +89,7 @@ else return ..() -/obj/item/extinguisher/attack_obj(obj/O, mob/living/user) +/obj/item/extinguisher/attack_atom(obj/O, mob/living/user) if(AttemptRefill(O, user)) refilling = TRUE return FALSE diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index d7d7cf9ef2fc..0792c4085680 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -1,3 +1,6 @@ +/// How many joules of energy from reactions required to cause 1 damage +#define JOULES_PER_DAMAGE 100000 + /obj/item/flamethrower name = "flamethrower" desc = "You are a firestarter!" @@ -54,7 +57,7 @@ if(M.is_holding(src)) location = M.loc if(isturf(location)) //start a fire if possible - igniter.flamethrower_process(location) + open_flame(igniter.heat) /obj/item/flamethrower/update_overlays() @@ -199,33 +202,21 @@ if(!istype(target)) return FALSE - var/ratio_removed = 1 - if(!release_all) - ratio_removed = min(ptank.distribute_pressure, ptank.air_contents.return_pressure()) / ptank.air_contents.return_pressure() + var/ratio_removed = min(ptank.distribute_pressure, ptank.air_contents.return_pressure()) / ptank.air_contents.return_pressure() + var/datum/gas_mixture/fuel_mix = ptank.air_contents.remove_ratio(ratio_removed) + var/datum/gas_mixture/turf_mix = target.return_air() + + fuel_mix.merge(turf_mix.copy()) // copy air from the turf to do reactions with + fuel_mix.set_temperature(igniter.heat) // heat the contents + + var/old_thermal_energy = fuel_mix.thermal_energy() + for(var/i in 1 to 10) // react a bunch of times on the target turf + if(!fuel_mix.react(target)) + break // break the loop if it stops reacting - // Return of the stimball flamethrower, wear radiation protection when using this or you're just as likely to die as your target - if(fuel_mix.get_moles(GAS_PLASMA) >= NITRO_BALL_MOLES_REQUIRED && fuel_mix.get_moles(GAS_NITRIUM) >= NITRO_BALL_MOLES_REQUIRED && fuel_mix.get_moles(GAS_PLUOXIUM) >= NITRO_BALL_MOLES_REQUIRED) - var/balls_shot = round(min(fuel_mix.get_moles(GAS_NITRIUM), fuel_mix.get_moles(GAS_PLUOXIUM), NITRO_BALL_MAX_REACT_RATE / NITRO_BALL_MOLES_REQUIRED)) - var/angular_increment = 360/balls_shot - var/random_starting_angle = rand(0,360) - for(var/i in 1 to balls_shot) - target.fire_nuclear_particle((i*angular_increment+random_starting_angle)) - fuel_mix.adjust_moles(GAS_PLASMA, -balls_shot * NITRO_BALL_MOLES_REQUIRED) // No free extra damage for you, conservation of mass go brrrrr - - // Funny rad flamethrower go brrr - if(fuel_mix.get_moles(GAS_TRITIUM)) // Tritium fires cause a bit of radiation - radiation_pulse(target, min(fuel_mix.get_moles(GAS_TRITIUM), fuel_mix.get_moles(GAS_O2)/2) * FIRE_HYDROGEN_ENERGY_RELEASED / TRITIUM_BURN_RADIOACTIVITY_FACTOR) - - // 8 damage at 0.5 mole transfer or ~17 kPa release pressure - // 16 damage at 1 mole transfer or ~35 kPa release pressure - var/damage = fuel_mix.get_moles(GAS_PLASMA) * 16 - // harder to achieve than plasma - damage += fuel_mix.get_moles(GAS_TRITIUM) * 24 // Lower damage than hydrogen, causes minor radiation - damage += fuel_mix.get_moles(GAS_H2) * 32 - // Maximum damage restricted by the available oxygen, with a hard cap at 16 - var/datum/gas_mixture/turf_air = target.return_air() - damage = min(damage, turf_air.get_moles(GAS_O2) + fuel_mix.get_moles(GAS_O2), max_damage) // capped by combined oxygen in the fuel mix and enviroment + // damage is based on the positive or negative energy of the reaction, with a cap + var/damage = min(abs(fuel_mix.thermal_energy() - old_thermal_energy) / JOULES_PER_DAMAGE, max_damage) // If there's not enough fuel and/or oxygen to do more than 1 damage, shut itself off if(damage < 1) @@ -251,22 +242,40 @@ for(var/turf/T in turflist) if(T == previousturf) continue //so we don't burn the tile we be standin on - for(var/obj/structure/blob/B in T) + var/cached_damage = 0 + + for(var/obj/structure/blob/blob in T) // This is run before atmos checks because blob can be atmos blocking but we still want to hit them // See /proc/default_ignite - var/damage = process_fuel(T) - if(!damage) - break // Out of gas, stop running pointlessly - B.take_damage(damage * 2, BURN, FIRE) // strong against blobs + if(!cached_damage) + cached_damage = process_fuel(T) + if(!lit) + break // stopped running, don't continue + if(QDELETED(blob)) + continue + blob.take_damage(cached_damage * 2, BURN, FIRE) // strong against blobs + + for(var/obj/structure/spacevine/vine in T) + // This is run before atmos checks because vines can be on top of a window or some other atmos-blocking structure + if(!cached_damage) + cached_damage = process_fuel(T) + if(!lit) + break // stopped running, don't continue + if(QDELETED(vine)) + continue + vine.take_damage(cached_damage * 3, BURN, FIRE, TRUE) // very strong against vines + var/list/turfs_sharing_with_prev = previousturf.GetAtmosAdjacentTurfs(alldir=1) if(!(T in turfs_sharing_with_prev)) break // Hit something that blocks atmos - if(igniter) - if(!igniter.ignite_turf(src,T)) - break // Out of gas, stop running pointlessly - else - if(!default_ignite(T)) - break // Out of gas, stop running pointlessly + + if(!cached_damage) + cached_damage = process_fuel(T) + if(!lit) + break // stopped running, don't continue + if(!burn_atoms_on_turf(T, cached_damage)) + break // Out of gas, stop running pointlessly + if(!sound_played) // play the sound once if we successfully ignite at least one thing sound_played = TRUE playsound(loc, pick(flame_sounds), 50, TRUE) @@ -281,10 +290,9 @@ // /obj/structure/blob/normal // Return value tells the parent whether to continue calculating the line -/obj/item/flamethrower/proc/default_ignite(turf/target, release_all = FALSE) - // do the fuel stuff - var/damage = process_fuel(target, release_all) - if(!damage) +/obj/item/flamethrower/proc/burn_atoms_on_turf(turf/target, damage) + // no damage? don't continue + if(damage <= 0) return FALSE //Burn it @@ -333,24 +341,17 @@ var/obj/projectile/P = hitby if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(5)) owner.visible_message(span_danger("\The [attack_text] hits the fueltank on [owner]'s [name], rupturing it! What a shot!")) - var/target_turf = get_turf(owner) - igniter.ignite_turf(src,target_turf, release_all = TRUE) - qdel(ptank) - return 1 //It hit the flamethrower, not them - - -/obj/item/assembly/igniter/proc/flamethrower_process(turf/open/location) - location.hotspot_expose(700,2) - -/obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F, turf/open/location, release_all = FALSE) - return F.default_ignite(location, release_all) + var/turf/target_turf = get_turf(owner) + burn_atoms_on_turf(target_turf, process_fuel(target_turf)) + return TRUE //It hit the flamethrower, not them + return ..() ///////////////////// Flamethrower as an energy weapon ///////////////////// // Currently used exclusively in /obj/item/gun/energy/printer/flamethrower /obj/item/ammo_casing/energy/flamethrower projectile_type = /obj/projectile/bullet/incendiary/flamethrower select_name = "fire" - fire_sound = null + fire_sound = 'sound/weapons/flamethrower1.ogg' firing_effect_type = null e_cost = 50 @@ -361,3 +362,5 @@ sharpness = SHARP_NONE range = 6 penetration_flags = PENETRATE_OBJECTS | PENETRATE_MOBS + +#undef JOULES_PER_DAMAGE diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 2423c687ef52..477af55a02f6 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -342,7 +342,7 @@ /obj/item/grenade/chem_grenade/radiation name = "Rad Bomb" - desc = "the best grenade to irridiate the fuck out of someone" + desc = "The best grenade to irradiate the fuck out of someone." stage = GRENADE_READY /obj/item/grenade/chem_grenade/radiation/Initialize(mapload) diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 8d9552276130..220e526453d3 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -58,6 +58,9 @@ /obj/item/grenade/attack_self(mob/user) if(!active) if(clown_check(user)) + if(HAS_TRAIT(user, TRAIT_NO_GRENADES)) + to_chat(user, span_warning("You can't use grenades!")) + return preprime(user) /obj/item/grenade/proc/log_grenade(mob/user, turf/T) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 15e28fc95142..819a1ce6f000 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -25,6 +25,10 @@ . = ..() ADD_TRAIT(src, TRAIT_EMPPROOF_CONTENTS, "innate_empproof") plastic_overlay = mutable_appearance(icon, "[item_state]2", ABOVE_ALL_MOB_LAYER) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/item/grenade/plastic/Destroy() qdel(nadeassembly) @@ -80,8 +84,7 @@ /obj/item/grenade/plastic/receive_signal() prime() -/obj/item/grenade/plastic/Crossed(atom/movable/AM) - . = ..() +/obj/item/grenade/plastic/proc/on_entered(datum/source, atom/movable/AM, ...) if(nadeassembly) nadeassembly.Crossed(AM) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index c14723dd7e6c..18824aa5da65 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -268,7 +268,11 @@ /obj/item/restraints/legcuffs/beartrap/Initialize(mapload) . = ..() - update_appearance(UPDATE_ICON) + update_appearance() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(trap_stepped_on), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/item/restraints/legcuffs/beartrap/update_icon_state() . = ..() @@ -310,6 +314,55 @@ update_appearance(UPDATE_ICON) playsound(src, 'sound/effects/snap.ogg', 50, TRUE) +/obj/item/restraints/legcuffs/beartrap/proc/trap_stepped_on(datum/source, atom/movable/entering, ...) + SIGNAL_HANDLER + + 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) + 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(span_danger("[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(span_danger("\The [src] ensnares [victim]!"), \ + span_userdanger("\The [src] ensnares you!")) + else + victim.visible_message(span_danger("[victim] triggers \the [src]."), \ + span_userdanger("You trigger \the [src]!")) + var/def_zone = BODY_ZONE_CHEST + if(iscarbon(victim) && victim.body_position == STANDING_UP) + 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/Crossed(AM as mob|obj) if(armed && isturf(loc)) if(isliving(AM)) diff --git a/code/game/objects/items/holy_armours.dm b/code/game/objects/items/holy_armours.dm index d9124b65e11d..01cfdc254a3a 100644 --- a/code/game/objects/items/holy_armours.dm +++ b/code/game/objects/items/holy_armours.dm @@ -84,6 +84,7 @@ armor = list(MELEE = -15, BULLET = -10, LASER = -10, ENERGY = -5, BOMB = -5, BIO = -2, RAD = 0, FIRE = 0, ACID = 0) slowdown = -0.1 //very statistically significant flags_inv = null //doesn't actually visibly hide anything + clothing_flags = LARGE_WORN_ICON worn_x_dimension = 64 worn_y_dimension = 64 dynamic_hair_suffix = "" @@ -233,3 +234,208 @@ icon_state = "darktemplar-chaplain1" item_state = "darktemplar-chaplain1" armor = list(MELEE = 30, BULLET = 10, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 60, RAD = 40, FIRE = 90, ACID = 80) + +/obj/item/storage/box/holy/flagelanteschains + name = "Flagenantes Kit" + +/obj/item/storage/box/holy/flagelanteschains/PopulateContents() + new /obj/item/clothing/suit/hooded/flagelantes_chains(src) + +/obj/item/clothing/suit/hooded/flagelantes_chains + name = "flagellant's chains" + desc = "Chains worn by those who wish to purify themselves through pain. They slow the wearer down initialy, but give divine haste the more pain they endure." + icon_state = "flagelantes_chains" + item_state = "flagelantes_chains" + armor = list(MELEE = -15, BULLET = -15, LASER = -15, ENERGY = -15, BOMB = -15, BIO = -15, RAD = 0, FIRE = 0, ACID = 0) + body_parts_covered = CHEST|GROIN|LEGS|ARMS + mutantrace_variation = MUTANTRACE_VARIATION //No leg squishing + resistance_flags = FIRE_PROOF | ACID_PROOF //No turning to ash/mush in the quest for pain + allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/tank/internals/ipc_coolant) + hoodtype = /obj/item/clothing/head/hooded/flagelantes_chains_hood + var/wrap = FALSE + var/obj/effect/abstract/particle_holder/flagelantes_effect + var/total_wounds + var/speed_message = FALSE + var/footstep = 1 + var/footstep_max = 2 + +/obj/item/clothing/suit/hooded/flagelantes_chains/equipped(mob/M, slot) + . = ..() + if(slot == ITEM_SLOT_OCLOTHING && iscarbon(M)) //Signals for sensing damage, healing, wounds, and movement + RegisterSignal(M, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(handle_damage)) + RegisterSignal(M, COMSIG_MOB_APPLY_HEALING, PROC_REF(on_heal)) + RegisterSignal(M, COMSIG_CARBON_GAIN_WOUND, PROC_REF(handle_wound_add)) + RegisterSignal(M, COMSIG_CARBON_LOSE_WOUND, PROC_REF(handle_wound_remove)) + RegisterSignal(M, COMSIG_MOVABLE_MOVED, PROC_REF(on_mob_move)) + else + UnregisterSignal(M, list(COMSIG_MOB_APPLY_DAMAGE, COMSIG_MOB_APPLY_HEALING, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_MOVABLE_MOVED)) + +/obj/item/clothing/suit/hooded/flagelantes_chains/dropped(mob/M) + . = ..() + UnregisterSignal(M, list(COMSIG_MOB_APPLY_DAMAGE, COMSIG_MOB_APPLY_HEALING, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_MOVABLE_MOVED)) + REMOVE_TRAIT(M, TRAIT_IGNOREDAMAGESLOWDOWN, type) + total_wounds = 0 + slowdown = 0 + if(flagelantes_effect) + QDEL_NULL(flagelantes_effect) + +/obj/item/clothing/suit/hooded/flagelantes_chains/ToggleHood() //So people can't just quickly wear it whenever they want to + var/mob/living/carbon/human/H = src.loc + if(wrap) //Make sure they're not already trying to wear it + to_chat(H, span_warning("You're already wrapping the chains around yourself!.")) + return + else if(!suittoggled) + if(H.wear_suit != src) + to_chat(H, span_warning("You must be wearing [src] to put up the hood!")) + return + if(H.head) + to_chat(H, span_warning("You're already wearing something on your head!")) + return + to_chat(H, span_notice("You start wrapping the chains around yourself.")) + H.visible_message(span_warning("[H] starts wrapping [src] around themselves!")) + playsound(get_turf(src), 'sound/spookoween/chain_rattling.ogg', 10, TRUE, -1) + wrap = TRUE + if(!do_after(H, 3 SECONDS, H)) + wrap = FALSE + H.balloon_alert(H, "You were interupted!") + return //Stop it from completing if they move + if(ishuman(src.loc)) + if(H.equip_to_slot_if_possible(hood,ITEM_SLOT_HEAD,0,0,1)) + suittoggled = TRUE + src.icon_state = "[initial(icon_state)]_t" + H.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.build_all_button_icons() + ADD_TRAIT(H, TRAIT_IGNOREDAMAGESLOWDOWN, type)// Ignore damage slowdown + change_slowdown(H, slowdown) //Change clothing slowdown based on damage + wrap = FALSE + else + RemoveHood() + REMOVE_TRAIT(H, TRAIT_IGNOREDAMAGESLOWDOWN, type) + total_wounds = 0 + slowdown = 0 + if(flagelantes_effect) + QDEL_NULL(flagelantes_effect) + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/handle_damage(mob/living/carbon/human/H, damage, damagetype, def_zone) + + SIGNAL_HANDLER + + if(suittoggled) //Make sure it only checks when the hood is up + change_slowdown(H, slowdown) //Change speed when damaged + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/on_heal(mob/living/carbon/human/H, amount, damtype) + + SIGNAL_HANDLER + + if(suittoggled) //Make sure it only checks when the hood is up + change_slowdown(H, slowdown) //Change speed when healed + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/handle_wound_add(mob/living/carbon/human/H, datum/wound/W, obj/item/bodypart/L) + + SIGNAL_HANDLER + + if(suittoggled) //Make sure it only checks when the hood is up + change_slowdown(H, slowdown) //Change speed when gaining a wound + + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/handle_wound_remove(mob/living/carbon/human/H, datum/wound/W, obj/item/bodypart/L) + + SIGNAL_HANDLER + + if(suittoggled) //Make sure it only checks when the hood is up + change_slowdown(H, slowdown) //Change speed when losing a wound + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/change_slowdown(mob/living/carbon/human/H, starting_slowdown) + var/health_percent = H.health / H.maxHealth + var/final_slowdown = 0 + + total_wounds = length(H.all_wounds) //Thanks Molti, Baimo, and Bibby + + if(total_wounds < 0) + total_wounds = 0 + + switch(total_wounds) //Change slowdown based on wounds + if(1) + final_slowdown += -0.1 + if(2) + final_slowdown += -0.2 + if(3 to INFINITY) //Max of three wounds for slowdown calculation + final_slowdown += -0.4 + + switch(health_percent) //Change slowdown based on health + if(0.90 to INFINITY) + final_slowdown += 1 + if(0.80 to 0.89) + final_slowdown += 0.5 + if(0.50 to 0.79) + final_slowdown += 0 + if(0.30 to 0.49) + final_slowdown += -0.2 + if(0.10 to 0.29) + final_slowdown += -0.4 + if(0 to 0.9) + final_slowdown += -0.6 + + slowdown = final_slowdown //set slowdown + + if(slowdown == -1) //Alert the user and those around that they've achieved MAXIMUM OVERDRIVE + if(!speed_message) + to_chat(H, span_notice("You feel yourself grow closer to the divine as your sins seep out of the chains!.")) + H.visible_message(span_warning("[H] starts sweating profusely!")) + speed_message = TRUE + else + speed_message = FALSE + + appearance_change(H, slowdown) //Add particles depending on slowdown + + change_footstep(slowdown) //Change occurance of chain noise + + if(slowdown > starting_slowdown) //Show bubble alert based on starting and new slowdown + H.balloon_alert(H, "You slow down!") + else if(slowdown < starting_slowdown) + H.balloon_alert(H, "You speed up!") + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/appearance_change(mob/living/carbon/human/H, slowdown) + switch(slowdown) + if(-0.9 to 1) + if(flagelantes_effect) + QDEL_NULL(flagelantes_effect) //Remove particle effect + if(-INFINITY to -1) + if(!flagelantes_effect) + flagelantes_effect = new(H, /particles/droplets) + flagelantes_effect.color = "#a41c1c" + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/change_footstep(slowdown) //So the chain sounds are not spammed at higher speeds + switch(slowdown) + if(0 to 1) + footstep_max = 2 + if(-0.3 to -0.1) + footstep_max = 3 + if(-0.9 to -0.4) + footstep_max = 4 + if(-INFINITY to -1) + footstep_max = 5 + +/obj/item/clothing/suit/hooded/flagelantes_chains/proc/on_mob_move() + var/mob/living/carbon/human/H = loc + if(!istype(H) || H.wear_suit != src) + return + if(footstep > footstep_max) + playsound(src, 'sound/weapons/chainhit.ogg', 3, 1) + footstep = 0 + else + footstep++ + +/obj/item/clothing/head/hooded/flagelantes_chains_hood + name = "flagellant's hood" + desc = "A hood worn by flagellants to hide their face." + icon = 'icons/obj/clothing/hats/hats.dmi' + mob_overlay_icon = 'icons/mob/clothing/head/head.dmi' + icon_state = "flagelantes_chains_hood" + item_state = "flagelantes_chains_hood" + armor = list(MELEE = -15, BULLET = -15, LASER = -15, ENERGY = -15, BOMB = -15, BIO = -15, RAD = 0, FIRE = 0, ACID = 0) + body_parts_covered = HEAD + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEHAIR|HIDEMASK + resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 593983b469fc..3cf8adbfd8f2 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -147,6 +147,10 @@ menutab = MENU_WEAPON additional_desc = "An exceptionally large sword, capable of occasionally deflecting blows." +/obj/item/nullrod/claymore/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack) + /obj/item/nullrod/claymore/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(attack_type == PROJECTILE_ATTACK) final_block_chance = 0 //Don't bring a sword to a gunfight @@ -359,6 +363,10 @@ menutab = MENU_WEAPON additional_desc = "The weapon of choice for a devout monk. Block incoming blows while striking weak points until your opponent is too exhausted to continue." +/obj/item/nullrod/bostaff/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack, arc_size=180) + /obj/item/nullrod/bostaff/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(attack_type == PROJECTILE_ATTACK) final_block_chance = 0 //Don't bring a stick to a gunfight @@ -610,6 +618,7 @@ . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 30, 100, 0, hitsound) + AddComponent(/datum/component/cleave_attack) /obj/item/nullrod/armblade name = "dark blessing" @@ -633,6 +642,7 @@ . = ..() ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) AddComponent(/datum/component/butchering, 80, 70) + AddComponent(/datum/component/cleave_attack) /obj/item/nullrod/armblade/tentacle name = "unholy blessing" @@ -852,7 +862,7 @@ C.regenerate_icons() /obj/item/nullrod/staff/worn_overlays(isinhands) - . = list() + . = ..() if(isinhands) . += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01) @@ -1033,7 +1043,6 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT var/possessed = FALSE - var/walking = FALSE //check to tell if they're flying around or not var/mob/living/simple_animal/shade/soul //when they're just a blade (stored inside the blade at all times) var/mob/living/simple_animal/nullrod/blade //when they're flying around (blade stored inside them (soul is inside that blade)) var/mob/living/owner //the person with the recall spell @@ -1041,6 +1050,10 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches menutab = MENU_MISC additional_desc = "You feel an unwoken presence in this one." +/obj/item/nullrod/talking/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack) + /obj/item/nullrod/talking/relaymove(mob/user) return //stops buckled message spam for the ghost. @@ -1101,12 +1114,13 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches visible_message("[src] smacks [owner] in the face as [owner.p_they()] try to catch it with [owner.p_their()] hands full!") else if(possessed && soul) transform = initial(transform)//to reset rotation for when it drops to the ground - blade = new /mob/living/simple_animal/nullrod(get_turf(src)) - blade.sword = src - blade.fully_replace_character_name(null, soul.name) + if(!blade) + blade = new(get_turf(src)) + blade.sword = src + blade.fully_replace_character_name(null, soul.name) forceMove(blade)//just hide it in here for now - soul.mind.transfer_to(blade) - walking = TRUE + if(soul?.mind) + soul.mind.transfer_to(blade) else . = ..() @@ -1132,18 +1146,22 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches return ..() /datum/action/cooldown/spell/recall_nullrod/cast(mob/living/carbon/user) - if(sword) - if(sword.walking) - sword.blade.throw_at(user, 20, 3) //remember, sword is the item, blade is the mob - else - if(ismob(sword.loc)) - var/mob/holder = sword.loc //rip it out of the thief's hands first - if(holder != user) - to_chat(holder, "you feel [sword] ripped out of your hands by an unseen force.") - holder.dropItemToGround(sword) - sword.throw_at(user, 20, 3) . = ..() + if(!sword) + return + + if(sword.blade) + sword.blade.throw_at(user, 20, 3) //remember, sword is the item, blade is the mob + return + if(ismob(sword.loc)) + var/mob/holder = sword.loc //rip it out of the thief's hands first + if(holder != user) + to_chat(holder, "you feel [sword] ripped out of your hands by an unseen force.") + holder.dropItemToGround(sword) + sword.throw_at(user, 20, 3) + +//the mob /mob/living/simple_animal/nullrod name = "Shade" real_name = "Shade" @@ -1187,9 +1205,9 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches /mob/living/simple_animal/nullrod/death() if(sword) visible_message("[src] lowers to the ground as it's power wanes!") - mind.transfer_to(sword.soul) + if(mind) + mind.transfer_to(sword.soul) sword.forceMove(get_turf(src)) - sword.walking = FALSE qdel(src) /mob/living/simple_animal/nullrod/canSuicide() @@ -1199,8 +1217,8 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches if(!sword.owner || M != sword.owner)//let the chaplain pick it up in one hit return ..() sword.owner.put_in_active_hand(sword) - mind.transfer_to(sword.soul) - sword.walking = FALSE + if(mind) + mind.transfer_to(sword.soul) visible_message("[sword.owner] grabs [src] by the hilt.") qdel(src) @@ -1210,8 +1228,8 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches var/mob/living/target = hit_atom if(sword?.owner && target == sword.owner) var/caught = sword.owner.put_in_hands(sword) - mind.transfer_to(sword.soul) - sword.walking = FALSE + if(mind) + mind.transfer_to(sword.soul) qdel(src) if(caught) visible_message("[sword.owner] catches the flying blade out of the air!") @@ -1336,6 +1354,10 @@ it also swaps back if it gets thrown into the chaplain, but the chaplain catches menutab = MENU_MISC //banish it from being associated with proper weapons additional_desc = "Hey, God here. Asking you to pick literally anything else as your implement of justice." +/obj/item/nullrod/sord/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack) // i guess??? + //NOT CHAPLAIN SPAWNABLE /obj/item/nullrod/talking/chainsword name = "possessed chainsaw sword" diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 9db5e9347a2a..e59488570965 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -33,7 +33,7 @@ if(cell && !(. & EMP_PROTECT_CONTENTS)) cell.emp_act(severity) -/obj/item/inducer/attack_obj(obj/O, mob/living/carbon/user) +/obj/item/inducer/attack_atom(obj/O, mob/living/carbon/user) if(user.a_intent == INTENT_HARM) return ..() diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index 575d61c42ea0..167d5e56af85 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -148,13 +148,14 @@ recipient_ref = WEAKREF(recipient) var/mob/living/body = recipient.current - var/list/goodies = generic_goodies + var/list/goodies = generic_goodies.Copy() var/datum/job/this_job = SSjob.GetJob(recipient.assigned_role) if(this_job) if(this_job.paycheck_department && department_colors[this_job.paycheck_department]) color = department_colors[this_job.paycheck_department] var/list/job_goodies = this_job.get_mail_goodies() + job_goodies = job_goodies.Copy() if(LAZYLEN(job_goodies)) // certain roles and jobs (prisoner) do not receive generic gifts. if(this_job.exclusive_mail_goodies) @@ -168,7 +169,7 @@ if(goodies[item] <= 0) //remove everything with a weight below 0 goodies -= item - if(!goodies) //if everything was removed for some reason + if(!length(goodies)) //if everything was removed for some reason return FALSE for(var/iterator in 1 to goodie_count) @@ -239,6 +240,8 @@ var/datum/job/this_job = SSjob.GetJob(human.mind.assigned_role) if(!this_job || this_job.faction != "Station") continue + if(is_synth(human)) + continue mail_recipients += human.mind @@ -281,7 +284,7 @@ desc = "A bag for letters, envelopes, and other postage." icon = 'icons/obj/library.dmi' icon_state = "bookbag" - //worn_icon_state = "bookbag" + worn_icon_state = "bookbag" resistance_flags = FLAMMABLE /obj/item/storage/bag/mail/Initialize(mapload) @@ -377,4 +380,3 @@ debug_info += " - [initial(goodie.name)]: [goodie_weight] ([(goodie_weight / job_goodies_weight) * 100]%)\n" to_chat(src, examine_block(debug_info)) - diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 0b41e021e48e..b5f37de5e195 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -10,7 +10,7 @@ /obj/item/book/manual/ripley_build_and_repair name = "APLU \"Ripley\" Construction and Operation Manual" icon_state ="book" - author = "Weyland-Yutani Corp" + author = "Sano-Waltfield Industries" title = "APLU \"Ripley\" Construction and Operation Manual" dat = {" @@ -24,7 +24,7 @@
- Weyland-Yutani - Building Better Worlds + Sano-Waltfield - Forging Better Futures

Autonomous Power Loader Unit \"Ripley\"

Specifications:

diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index bf0e97233bb1..62f568306497 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -105,6 +105,10 @@ block_chance = 50 saber_color = "green" +/obj/item/melee/transforming/energy/sword/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack) // very cool + /obj/item/melee/transforming/energy/sword/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/melee/transforming/energy/sword)) if(HAS_TRAIT(I, TRAIT_NODROP) || HAS_TRAIT(src, TRAIT_NODROP)) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index f6e5c5423699..ce901ed04df3 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -80,8 +80,13 @@ hitsound = 'sound/weapons/rapierhit.ogg' materials = list(/datum/material/iron = 1000) +/obj/item/melee/cutlass/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack) + /obj/item/melee/sabre/Initialize(mapload) . = ..() + AddComponent(/datum/component/cleave_attack) // YES AddComponent(/datum/component/butchering, 30, 95, 5) //fast and effective, but as a sword, it might damage the results. /obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) @@ -322,7 +327,8 @@ /obj/item/melee/classic_baton/attack(mob/living/target, mob/living/user) if(!on) return ..() - + if(!synth_check(user, SYNTH_RESTRICTED_WEAPON)) + return if(HAS_TRAIT(user, TRAIT_NO_STUN_WEAPONS)) to_chat(user, span_warning("You can't seem to remember how this works!")) return diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 6e9906b343d9..4ca47a8f67ef 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -86,22 +86,16 @@ var/has_owner = FALSE var/pinpointer_owner = null -/obj/item/pinpointer/crew/proc/trackable(mob/living/carbon/human/H) +/obj/item/pinpointer/crew/proc/trackable(mob/living/carbon/human/tracked_mob) var/turf/here = get_turf(src) - var/nanite_sensors = FALSE - if(H in SSnanites.nanite_monitored_mobs) - nanite_sensors = TRUE - if((H.z == 0 || H.z == here.z) && (istype(H.w_uniform, /obj/item/clothing/under) || nanite_sensors)) - if(!nanite_sensors) // Does the mob have monitoring nanite? - var/obj/item/clothing/under/U = H.w_uniform - - // Suit sensors must be on maximum. - if(!U.has_sensor || (U.sensor_mode < SENSOR_COORDS && !ignore_suit_sensor_level)) - return FALSE - - var/turf/there = get_turf(H) - return (H.z != 0 || (there && there.z == here.z)) - + var/turf/there = get_turf(tracked_mob) + if(here && there && ((there.z in SSmapping.get_connected_levels(here)) || HAS_TRAIT(tracked_mob, TRAIT_MULTIZ_SUIT_SENSORS))) // Device and target should be on the same level or different levels of the same station + if(HAS_TRAIT(tracked_mob, TRAIT_SUITLESS_SENSORS)) + return TRUE + if (istype(tracked_mob.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = tracked_mob.w_uniform + if(U.has_sensor && (U.sensor_mode >= SENSOR_COORDS || ignore_suit_sensor_level)) // Suit sensors must be on maximum or a contractor pinpointer + return TRUE return FALSE /obj/item/pinpointer/crew/attack_self(mob/living/user) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index b098d3320d53..f29a5f236fc2 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -137,6 +137,10 @@ . = ..() if(undertile_pressureplate) AddElement(/datum/element/undertile, tile_overlay = tile_overlay, use_anchor = FALSE) //we remove use_anchor here, so it ALWAYS stays anchored + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/item/pressure_plate/hologrid/examine(mob/user) . = ..() @@ -148,8 +152,7 @@ flick("lasergrid_a",src) icon_state = "lasergrid_full" -/obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM) - . = ..() +/obj/item/pressure_plate/hologrid/proc/on_entered(datum/source, atom/movable/AM, ...) if(trigger_item && istype(AM, specific_item) && !claimed) claimed = TRUE flick("laserbox_burn", AM) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index d896615dbf01..f6ddcc25c1d0 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -285,6 +285,7 @@ armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 50, BOMB = 70, BIO = 60, RAD = 50, FIRE = 60, ACID = 60) //religion protects you from disease and radiation, honk. worn_x_dimension = 64 worn_y_dimension = 64 + clothing_flags = LARGE_WORN_ICON /obj/item/clothing/head/helmet/plate/crusader/prophet/red icon_state = "prophet-red" diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm index 26f6b553ce4f..97498bd0b8a4 100644 --- a/code/game/objects/items/robot/ai_upgrades.dm +++ b/code/game/objects/items/robot/ai_upgrades.dm @@ -8,7 +8,6 @@ icon = 'icons/obj/module.dmi' icon_state = "datadisk3" - /obj/item/malf_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user) . = ..() if(!istype(AI)) @@ -20,12 +19,11 @@ to_chat(AI, span_userdanger("[user] has upgraded you with combat software!")) to_chat(AI, span_userdanger("Your current laws and objectives remain unchanged.")) //this unlocks malf powers, but does not give the license to plasma flood AI.add_malf_picker() - log_game("[key_name(user)] has upgraded [key_name(AI)] with a [src].") - message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].") + log_game("[key_name(user)] has upgraded [key_name(AI)] with \a [src].") + message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with \a [src].") to_chat(user, span_notice("You upgrade [AI]. [src] is consumed in the process.")) qdel(src) - //Lipreading /obj/item/surveillance_upgrade name = "surveillance software upgrade" @@ -42,6 +40,195 @@ to_chat(AI, span_userdanger("[user] has upgraded you with surveillance software!")) to_chat(AI, "Via a combination of hidden microphones and lip reading software, you are able to use your cameras to listen in on conversations.") to_chat(user, span_notice("You upgrade [AI]. [src] is consumed in the process.")) - log_game("[key_name(user)] has upgraded [key_name(AI)] with a [src].") - message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with a [src].") + log_game("[key_name(user)] has upgraded [key_name(AI)] with \a [src].") + message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with \a [src].") + qdel(src) + +/obj/item/cameragun_upgrade + name = "camera laser upgrade" + desc = "A software package that will allow an artificial intelligence to briefly increase the amount of light an camera outputs to an outrageous amount to the point it burns skins. Must be installed using an unlocked AI control console." // In short, laser gun! + icon = 'icons/obj/module.dmi' + icon_state = "datadisk3" + +/obj/item/cameragun_upgrade/afterattack(mob/living/silicon/ai/AI, mob/user) + . = ..() + if(!istype(AI)) + return + + var/datum/action/innate/ai/ranged/cameragun/ai_action + for(var/datum/action/innate/ai/ranged/cameragun/listed_action in AI.actions) + if(!listed_action.from_traitor) // Duplicate. + to_chat(user, span_notice("[AI] has already been upgraded with \a [src].")) + return + ai_action = listed_action // If they somehow have more than one action, blame adminbus first. + ai_action.from_traitor = FALSE // Let them keep the action if they lose traitor status. + + if(!ai_action) + ai_action = new + ai_action.Grant(AI) + + to_chat(user, span_notice("You upgrade [AI]. [src] is consumed in the process.")) + log_game("[key_name(user)] has upgraded [key_name(AI)] with \a [src].") + message_admins("[ADMIN_LOOKUPFLW(user)] has upgraded [ADMIN_LOOKUPFLW(AI)] with \a [src].") qdel(src) + +/// An ability that allows the user to shoot a laser beam at a target from the nearest camera. +// TODO: If right-click functionality for buttons are added, make singleshot a left-click ability & burstmode a right-click ability. +/datum/action/innate/ai/ranged/cameragun + name = "Camera Laser Gun" + desc = "Shoots a laser from the nearest available camera toward a chosen destination if it is highly probable to reach said destination. If successful, enters burst mode which temporarily allows the ability to be reused every second for 30 seconds." + button_icon = 'icons/obj/guns/energy.dmi' + button_icon_state = "laser" + background_icon_state = "bg_default" // Better button sprites welcomed. :) + enable_text = span_notice("You prepare to overcharge a camera. Click a target for a nearby camera to shoot a laser at.") + disable_text = span_notice("You dissipate the overcharged energy.") + click_action = FALSE // Even though that we are a click action, we want to use Activate() and Deactivate(). + /// The beam projectile that is spawned and shot. + var/obj/projectile/beam/proj_type = /obj/projectile/beam/laser + /// Pass flags used for the `can_shoot_to` proc. + var/proj_pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + /// If this ability is sourced from being a traitor AI. + var/from_traitor = FALSE + /// Is burst mode activated? + var/burstmode_activated = FALSE + /// How long is burst mode? + var/burstmode_length = 30 SECONDS + COOLDOWN_DECLARE(since_burstmode) + /// How much time (after burst mode is deactivated) must pass before it can be activated again? + var/activate_cooldown = 60 SECONDS + COOLDOWN_DECLARE(next_activate) + /// How much time between shots (during burst mode)? + var/fire_cooldown = 1 SECONDS + COOLDOWN_DECLARE(next_fire) + /// What EMP strength will the camera be hit with after it is used to shoot? + var/emp_drawback = EMP_HEAVY // 7+ guarantees a 90 seconds downtime. + +/// Checks if it is possible for a (hitscan) projectile to reach a target in a straight line from a camera. +/datum/action/innate/ai/ranged/cameragun/proc/can_shoot_to(obj/machinery/camera/C, atom/target) + var/obj/projectile/proj = new /obj/projectile + proj.icon = null + proj.icon_state = null + proj.hitsound = "" + proj.suppressed = TRUE + proj.ricochets_max = 0 + proj.ricochet_chance = 0 + proj.damage = 0 + proj.nodamage = TRUE // Prevents this projectile from detonating certain objects (e.g. welding tanks). + proj.log_override = TRUE + proj.hitscan = TRUE + proj.pass_flags = proj_pass_flags + + proj.preparePixelProjectile(target, C) + proj.fire() + + var/turf/target_turf = get_turf(target) + var/turf/last_turf = proj.hitscan_last + if(last_turf == target_turf) + return TRUE + return FALSE + +/datum/action/innate/ai/ranged/cameragun/New() + ..() + START_PROCESSING(SSfastprocess, src) + +/datum/action/innate/ai/ranged/cameragun/Destroy() + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/datum/action/innate/ai/ranged/cameragun/process() + if(burstmode_activated && COOLDOWN_FINISHED(src, since_burstmode)) + toggle_burstmode() + build_all_button_icons() + +/datum/action/innate/ai/ranged/cameragun/Activate(loud = TRUE) + set_ranged_ability(owner, loud ? enable_text : null) + active = TRUE + background_icon_state = "bg_default_on" + build_all_button_icons() + +/datum/action/innate/ai/ranged/cameragun/Deactivate(loud = TRUE) + unset_ranged_ability(owner, loud ? disable_text : null) + active = FALSE + background_icon_state = "bg_default" + build_all_button_icons() + +/datum/action/innate/ai/ranged/cameragun/IsAvailable(feedback = FALSE) + . = ..() + if(!.) + return FALSE + if(burstmode_activated && !COOLDOWN_FINISHED(src, next_fire)) // Not ready to shoot (during brustmode). + return FALSE + if(!burstmode_activated && !COOLDOWN_FINISHED(src, next_activate)) // Burstmode is not ready. + return FALSE + +/datum/action/innate/ai/ranged/cameragun/do_ability(mob/living/caller, params, atom/target) + var/turf/loc_target = get_turf(target) + var/obj/machinery/camera/chosen_camera + for(var/obj/machinery/camera/cam in GLOB.cameranet.cameras) + if(!isturf(cam.loc)) + continue + if(cam == target) + continue + if(!cam.status || cam.emped) // Non-functional camera. + continue + var/turf/loc_camera = get_turf(cam) + if(loc_target.z != loc_camera.z) + continue + if(get_dist(cam, target) <= 1) // Pointblank shot. + chosen_camera = cam + break + if(get_dist(cam, target) > 12) + continue + if(!can_shoot_to(cam, target)) // No chance to hit. + continue + if(!chosen_camera) + chosen_camera = cam + continue + if(get_dist(chosen_camera, target) > get_dist(cam, target)) // Closest camera that can hit. + chosen_camera = cam + continue + if(!chosen_camera) + Deactivate(FALSE) + to_chat(caller, span_notice("Unable to find nearby available cameras for this target.")) + return FALSE + if(!burstmode_activated) + toggle_burstmode() + + COOLDOWN_START(src, next_fire, fire_cooldown) + var/turf/loc_chosen = get_turf(chosen_camera) + var/obj/projectile/beam/proj = new proj_type(loc_chosen) + if(!isprojectile(proj)) + Deactivate(FALSE) + CRASH("Camera gun's proj_type was not a projectile.") + proj.preparePixelProjectile(target, chosen_camera) + proj.firer = caller + + // Fire the shot. + var/pointblank = get_dist(chosen_camera, target) <= 1 ? TRUE : FALSE // Same tile or right next. + if(pointblank) + chosen_camera.visible_message(span_danger("[chosen_camera] fires a laser point blank at [target]!")) + proj.fire(direct_target = target) + else + chosen_camera.visible_message(span_danger("[chosen_camera] fires a laser!")) + proj.fire() + Deactivate(FALSE) + to_chat(caller, span_danger("Camera overcharged.")) + + /* This EMP prevents burstmode from annihilating a stationary object/person. + If someone gives a camera EMP resistance, then they had it coming. */ + if(emp_drawback > 0) + chosen_camera.emp_act(emp_drawback) + return TRUE + +/datum/action/innate/ai/ranged/cameragun/proc/toggle_burstmode() + burstmode_activated = !burstmode_activated + if(burstmode_activated) + COOLDOWN_START(src, since_burstmode, burstmode_length) + to_chat(owner, span_notice("Burstmode activated.")) + owner.playsound_local(owner, 'sound/effects/light_flicker.ogg', 50, FALSE) + else + COOLDOWN_START(src, next_activate, activate_cooldown) + to_chat(owner, span_notice("Burstmode deactivated.")) + Deactivate(FALSE) // In case that they were in the middle of shooting. + owner.playsound_local(owner, 'sound/items/timer.ogg', 50, FALSE) + return TRUE diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 78ba724345ed..e16c427dfb17 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -74,6 +74,10 @@ return 1 return 0 +/obj/item/robot_suit/examine(mob/user) + . = ..() + . += "If you insert an AI CPU when this endoskeleton is complete it will be constructed as a synthetic." + /obj/item/robot_suit/wrench_act(mob/living/user, obj/item/I) //Deconstucts empty borg shell. Flashes remain unbroken because they haven't been used yet var/turf/T = get_turf(src) if(l_leg || r_leg || chest || l_arm || r_arm || head) @@ -252,6 +256,27 @@ else to_chat(user, span_warning("The endoskeleton must be assembled before debugging can begin!")) + else if(istype(W, /obj/item/ai_cpu)) + if(check_completion()) + var/response = tgui_alert(user, "Are you sure you want to turn this endoskeleton into a synthetic unit?", "Please Confirm", list("Yes", "No")) + if(response != "Yes") + return + + if(!user.temporarilyRemoveItemFromInventory(W)) + return + var/mob/living/carbon/human/O = new /mob/living/carbon/human(get_turf(loc)) + O.set_species(/datum/species/wy_synth) + O.invisibility = 0 + O.job = "Synthetic" + var/datum/outfit/job/synthetic/SO = new() + SO.equip(O) + W.forceMove(O) + var/datum/species/wy_synth/S = O.dna.species + qdel(S.inbuilt_cpu) + S.inbuilt_cpu = null + S.inbuilt_cpu = W + qdel(src) + else if(istype(W, /obj/item/mmi)) var/obj/item/mmi/M = W if(check_completion()) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 200c5bc71843..1a837b6338d3 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -45,27 +45,16 @@ playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) cooldown = world.time else if(istype(W, repair_material)) - if (obj_integrity >= max_integrity) + if (atom_integrity >= max_integrity) to_chat(user, span_notice("[src] is already in perfect condition.")) else var/obj/item/stack/sheet/mineral/T = W T.use(1) - obj_integrity = max_integrity + update_integrity(max_integrity) to_chat(user, span_notice("You repair [src] with [T].")) else return ..() -/obj/item/shield/riot/examine(mob/user) - . = ..() - var/healthpercent = round((obj_integrity/max_integrity) * 100, 1) - switch(healthpercent) - if(50 to 99) - . += span_info("It looks slightly damaged.") - if(25 to 50) - . += span_info("It appears heavily damaged.") - if(0 to 25) - . += span_warning("It's falling apart!") - /obj/item/shield/riot/proc/shatter(mob/living/carbon/human/owner) playsound(owner, 'sound/effects/glassbr3.ogg', 100) new /obj/item/shard((get_turf(src))) @@ -73,7 +62,7 @@ /obj/item/shield/riot/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) if(!damage) return ..() - if (obj_integrity <= damage) + if (atom_integrity <= damage) var/turf/T = get_turf(owner) T.visible_message(span_warning("[hitby] destroys [src]!")) shatter(owner) diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index d5d4ba24e585..a4f2fd4ae875 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -100,6 +100,7 @@ force_wielded = 20, \ icon_wielded = "[base_icon_state]1", \ ) + AddComponent(/datum/component/cleave_attack, arc_size=180, requires_wielded=TRUE) /obj/item/mjolnir/update_icon_state() . = ..() diff --git a/code/game/objects/items/stacks/license_plates.dm b/code/game/objects/items/stacks/license_plates.dm index ece53770f9fa..92f7edc922ee 100644 --- a/code/game/objects/items/stacks/license_plates.dm +++ b/code/game/objects/items/stacks/license_plates.dm @@ -1,6 +1,6 @@ /obj/item/stack/license_plates name = "invalid plate" - desc = "someone fucked up" + desc = "Someone fucked up." icon = 'icons/obj/machines/prison.dmi' icon_state = "empty_plate" novariants = FALSE diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 8f16951dd3a2..093e4fc014a8 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -10,6 +10,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("fore port spacepod frame", /obj/item/pod_parts/pod_frame/fore_port, 15, time = 30, one_per_turf = 0), \ new/datum/stack_recipe("fore starboard spacepod frame", /obj/item/pod_parts/pod_frame/fore_starboard, 15, time = 30, one_per_turf = 0), \ new/datum/stack_recipe("aft port spacepod frame", /obj/item/pod_parts/pod_frame/aft_port, 15, time = 30, one_per_turf = 0), \ + new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20), \ new/datum/stack_recipe("aft starboard spacepod frame", /obj/item/pod_parts/pod_frame/aft_starboard, 15, time = 30, one_per_turf = 0), \ // yogs end )) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 1e0d461617d4..3b79b6b5eb90 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("crate shelf parts", /obj/item/rack_parts/shelf), \ )), \ null, \ - new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister/generic, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("portable pump", /obj/machinery/portable_atmospherics/pump, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ null, \ new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \ @@ -265,7 +265,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ recipes = GLOB.wood_recipes return ..() -/obj/item/stack/sheet/mineral/wood/attack_obj(obj/O, mob/living/user) +/obj/item/stack/sheet/mineral/wood/attack_atom(obj/O, mob/living/user) if(istype(O, /obj/structure/window) || istype(O, /obj/machinery/door/airlock) || istype(O,/obj/machinery/door)) //I hate this but reportedly there is no other way :skull: for(var/obj/structure/barricade/wooden/crude/crude in get_turf(O)) to_chat(user, span_warning("There is already a barricade there!")) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index db82eced86df..a4c5ab86bf35 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -451,3 +451,52 @@ /obj/item/stack/tile/eighties/loaded amount = 15 + +//Catwalk Tiles +/obj/item/stack/tile/catwalk_tile //This is our base type, sprited to look maintenance-styled + name = "catwalk plating" + singular_name = "catwalk plating tile" + desc = "Flooring that shows its contents underneath. Engineers love it!" + icon_state = "maint_catwalk" + materials = list(/datum/material/iron=100) + turf_type = /turf/open/floor/catwalk_floor + merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with eachother + +/obj/item/stack/tile/catwalk_tile/sixty + amount = 60 + +/obj/item/stack/tile/catwalk_tile/iron + name = "iron catwalk floor" + singular_name = "iron catwalk floor tile" + icon_state = "iron_catwalk" + turf_type = /turf/open/floor/catwalk_floor/iron + +/obj/item/stack/tile/catwalk_tile/iron_white + name = "white catwalk floor" + singular_name = "white catwalk floor tile" + icon_state = "whiteiron_catwalk" + turf_type = /turf/open/floor/catwalk_floor/iron_white + +/obj/item/stack/tile/catwalk_tile/iron_dark + name = "dark catwalk floor" + singular_name = "dark catwalk floor tile" + icon_state = "darkiron_catwalk" + turf_type = /turf/open/floor/catwalk_floor/iron_dark + +/obj/item/stack/tile/catwalk_tile/flat_white + name = "flat white catwalk floor" + singular_name = "flat white catwalk floor tile" + icon_state = "flatwhite_catwalk" + turf_type = /turf/open/floor/catwalk_floor/flat_white + +/obj/item/stack/tile/catwalk_tile/titanium + name = "titanium catwalk floor" + singular_name = "titanium catwalk floor tile" + icon_state = "titanium_catwalk" + turf_type = /turf/open/floor/catwalk_floor/titanium + +/obj/item/stack/tile/catwalk_tile/iron_smooth //this is the greenish one + name = "smooth iron catwalk floor" + singular_name = "smooth iron catwalk floor tile" + icon_state = "smoothiron_catwalk" + turf_type = /turf/open/floor/catwalk_floor/iron_smooth diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 05e71905832e..57fd0aefe77d 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -672,7 +672,7 @@ STR.silent = TRUE /obj/item/storage/backpack/duffelbag/clown/syndie/PopulateContents() - new /obj/item/pda/clown(src) + new /obj/item/modular_computer/tablet/pda/preset/clown/syndicate (src) new /obj/item/clothing/under/rank/clown(src) new /obj/item/clothing/shoes/clown_shoes(src) new /obj/item/clothing/mask/gas/clown_hat(src) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 781736380a5e..b01350b8ca5e 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -123,10 +123,18 @@ new /obj/item/disk/nanite_program(src) // Ordinary survival box +/obj/item/storage/box/survival + var/mask_type = /obj/item/clothing/mask/breath + var/internal_type = /obj/item/tank/internals/emergency_oxygen + var/medipen_type = /obj/item/reagent_containers/autoinjector/medipen + /obj/item/storage/box/survival/PopulateContents() - new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/internals/emergency_oxygen(src) - new /obj/item/reagent_containers/autoinjector/medipen(src) + if(!isnull(mask_type)) + new mask_type(src) + if(!isnull(internal_type)) + new internal_type(src) + if(!isnull(medipen_type)) + new medipen_type(src) if(HAS_TRAIT(SSstation, STATION_TRAIT_PREMIUM_INTERNALS)) new /obj/item/flashlight/flare(src) @@ -145,51 +153,62 @@ qdel(mask) // Get rid of the items that shouldn't be qdel(internals) -/obj/item/storage/box/survival_mining/PopulateContents() - new /obj/item/clothing/mask/gas/explorer(src) - new /obj/item/tank/internals/emergency_oxygen(src) +/obj/item/storage/box/survival/mining + mask_type = /obj/item/clothing/mask/gas/explorer + +/obj/item/storage/box/survival/mining/PopulateContents() + ..() new /obj/item/crowbar/red(src) new /obj/item/gps/mining(src) - new /obj/item/reagent_containers/autoinjector/medipen(src) // Engineer survival box -/obj/item/storage/box/engineer/PopulateContents() - new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/internals/emergency_oxygen/engi(src) - new /obj/item/reagent_containers/autoinjector/medipen(src) +/obj/item/storage/box/survival/engineer + internal_type = /obj/item/tank/internals/emergency_oxygen/engi -/obj/item/storage/box/engineer/radio/PopulateContents() +/obj/item/storage/box/survival/engineer/radio/PopulateContents() ..() // we want the regular items too. new /obj/item/radio/off(src) // Syndie survival box -/obj/item/storage/box/syndie/PopulateContents() - new /obj/item/clothing/mask/gas/syndicate(src) - new /obj/item/tank/internals/emergency_oxygen/engi(src) +/obj/item/storage/box/survival/syndie + mask_type = /obj/item/clothing/mask/gas/syndicate + internal_type = /obj/item/tank/internals/emergency_oxygen/engi + +/obj/item/storage/box/survival/syndie/PopulateContents() + ..() new /obj/item/extinguisher/mini(src) // Security survival box -/obj/item/storage/box/security/PopulateContents() - new /obj/item/clothing/mask/gas/sechailer(src) - new /obj/item/tank/internals/emergency_oxygen(src) - new /obj/item/reagent_containers/autoinjector/medipen(src) +/obj/item/storage/box/survival/security + mask_type = /obj/item/clothing/mask/gas/sechailer -/obj/item/storage/box/security/radio/PopulateContents() +/obj/item/storage/box/survival/security/radio/PopulateContents() ..() // we want the regular stuff too new /obj/item/radio/off(src) -// Plasmaman survival box -/obj/item/storage/box/plasmaman/PopulateContents() - new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/internals/plasmaman/belt/full(src) - new /obj/item/reagent_containers/autoinjector/medipen(src) +//Clown survival box +/obj/item/storage/box/survival/hug + name = "box of hugs" + desc = "A special box for sensitive people." + icon_state = "hugbox" + illustration = "heart" + mask_type = null + foldable = null -/obj/item/storage/box/plasmaman/miner/PopulateContents() //mining box for plasmemes - new /obj/item/clothing/mask/gas/explorer(src) - new /obj/item/tank/internals/plasmaman/belt/full(src) - new /obj/item/crowbar/red(src) - new /obj/item/gps/mining(src) - new /obj/item/reagent_containers/autoinjector/medipen(src) +/obj/item/storage/box/survival/hug/suicide_act(mob/user) + user.visible_message(span_suicide("[user] clamps the box of hugs on [user.p_their()] jugular! Guess it wasn't such a hugbox after all..")) + return (BRUTELOSS) + +/obj/item/storage/box/survival/hug/attack_self(mob/user) + ..() + user.changeNext_move(CLICK_CD_MELEE) + playsound(loc, "rustle", 50, vary = TRUE, extrarange = -5) + user.visible_message(span_notice("[user] hugs [src]."), span_notice("You hug [src].")) + +//Mime survival box +/obj/item/storage/box/survival/hug/black + icon_state = "hugbox_black" + illustration = "heart_black" /obj/item/storage/box/gloves name = "box of latex gloves" @@ -624,16 +643,6 @@ new /obj/item/card/id/prisoner/six(src) new /obj/item/card/id/prisoner/seven(src) -/obj/item/storage/box/seccarts - name = "box of PDA security cartridges" - desc = "A box full of PDA cartridges used by Security." - illustration = "pda" - -/obj/item/storage/box/seccarts/PopulateContents() - new /obj/item/cartridge/detective(src) - for(var/i in 1 to 6) - new /obj/item/cartridge/security(src) - /obj/item/storage/box/firingpins name = "box of standard firing pins" desc = "A box full of standard firing pins, to allow newly-developed firearms to operate." @@ -851,6 +860,10 @@ playsound(loc, "rustle", 50, 1, -5) user.visible_message(span_notice("[user] hugs \the [src]."),span_notice("You hug \the [src].")) +/obj/item/storage/box/hug/black + icon_state = "hugbox_black" + illustration = "heart_black" + /////clown box & honkbot assembly /obj/item/storage/box/clown name = "clown box" @@ -878,15 +891,6 @@ new /obj/item/stack/medical/ointment(src) new /obj/item/reagent_containers/autoinjector/medipen(src) -/obj/item/storage/box/hug/survival/PopulateContents() - new /obj/item/clothing/mask/breath(src) - new /obj/item/tank/internals/emergency_oxygen(src) - new /obj/item/reagent_containers/autoinjector/medipen(src) - - if(HAS_TRAIT(SSstation, STATION_TRAIT_PREMIUM_INTERNALS)) - new /obj/item/flashlight/flare(src) - new /obj/item/radio/off(src) - /obj/item/storage/box/rubbershot name = "box of rubber shots" desc = "A box full of rubber shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell." @@ -1083,7 +1087,7 @@ /obj/item/storage/box/ingredients/italian/PopulateContents() for(var/i in 1 to 3) new /obj/item/reagent_containers/food/snacks/grown/tomato(src) - new /obj/item/reagent_containers/food/snacks/meatball(src) //YOGS - bigotry rule + new /obj/item/reagent_containers/food/snacks/raw_meatball(src) //YOGS - bigotry rule new /obj/item/reagent_containers/food/drinks/bottle/wine(src) /obj/item/storage/box/ingredients/vegetarian @@ -1106,7 +1110,7 @@ new /obj/item/reagent_containers/food/snacks/grown/potato(src) new /obj/item/reagent_containers/food/snacks/grown/tomato(src) new /obj/item/reagent_containers/food/snacks/grown/corn(src) - new /obj/item/reagent_containers/food/snacks/meatball(src) //YOGS - bigotry rule + new /obj/item/reagent_containers/food/snacks/raw_meatball(src) //YOGS - bigotry rule /obj/item/storage/box/ingredients/fruity theme_name = "fruity" @@ -1162,7 +1166,7 @@ new /obj/item/reagent_containers/food/snacks/carpmeat(src) new /obj/item/reagent_containers/food/snacks/meat/slab/xeno(src) new /obj/item/reagent_containers/food/snacks/meat/slab/corgi(src) - new /obj/item/reagent_containers/food/snacks/meatball(src) //YOGS - bigotry rule + new /obj/item/reagent_containers/food/snacks/raw_meatball(src) //YOGS - bigotry rule /obj/item/storage/box/ingredients/exotic theme_name = "exotic" @@ -1331,7 +1335,7 @@ icon = 'icons/obj/food/containers.dmi' var/beantype = /obj/item/reagent_containers/food/snacks/grown/coffee -/obj/item/storage/box/cofeepack/Initialize(mapload) +/obj/item/storage/box/coffeepack/Initialize(mapload) . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 5 @@ -1339,8 +1343,8 @@ /obj/item/storage/box/coffeepack/PopulateContents() var/static/items_inside = list( - /obj/item/reagent_containers/food/snacks/grown/coffee = 5, - /obj/item/reagent_containers/food/snacks/grown/coffee/robusta = 5) + beantype = 5 + ) generate_items_inside(items_inside,src) /obj/item/storage/box/coffeepack/robusta diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 2525b065e27d..d5bf8fe8c903 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -11,12 +11,12 @@ throw_speed = 2 throw_range = 7 w_class = WEIGHT_CLASS_BULKY - materials = list(/datum/material/iron = 500) + custom_materials = list(/datum/material/iron = 500) //Toolboxes by default use iron as their core, custom material. attack_verb = list("robusted") hitsound = 'sound/weapons/smash.ogg' drop_sound = 'sound/items/handling/toolbox_drop.ogg' pickup_sound = 'sound/items/handling/toolbox_pickup.ogg' - custom_materials = list(/datum/material/iron = 500) //Toolboxes by default use iron as their core, custom material. + material_flags = MATERIAL_EFFECTS var/latches = "single_latch" var/has_latches = TRUE wound_bonus = 5 @@ -44,7 +44,6 @@ name = "emergency toolbox" icon_state = "red" item_state = "toolbox_red" - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/emergency/PopulateContents() new /obj/item/crowbar/red(src) @@ -67,13 +66,11 @@ name = "rusty red toolbox" icon_state = "toolbox_red_old" has_latches = FALSE - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/mechanical name = "mechanical toolbox" icon_state = "blue" item_state = "toolbox_blue" - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/mechanical/PopulateContents() new /obj/item/screwdriver(src) @@ -87,7 +84,6 @@ name = "rusty blue toolbox" icon_state = "toolbox_blue_old" has_latches = FALSE - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/mechanical/old/heirloom name = "toolbox" //this will be named "X family toolbox" @@ -135,7 +131,6 @@ name = "electrical toolbox" icon_state = "yellow" item_state = "toolbox_yellow" - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/electrical/PopulateContents() var/pickedcolor = pick(GLOB.cable_colors) @@ -157,7 +152,6 @@ force = 18 throwforce = 21 w_class = WEIGHT_CLASS_NORMAL - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/syndicate/Initialize(mapload) . = ..() @@ -186,7 +180,6 @@ name = "mechanical toolbox" icon_state = "blue" item_state = "toolbox_blue" - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/drone/PopulateContents() var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white") @@ -208,7 +201,6 @@ w_class = WEIGHT_CLASS_HUGE attack_verb = list("robusted", "crushed", "smashed") var/fabricator_type = /obj/item/clockwork/replica_fabricator/scarab - material_flags = MATERIAL_NO_COLOR /obj/item/storage/toolbox/brass/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index b4d4112daacd..8878f19fec56 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -772,7 +772,6 @@ new /obj/item/storage/backpack/chameleon/syndicate(src) new /obj/item/radio/headset/chameleon/syndicate(src) new /obj/item/stamp/chameleon/syndicate(src) - new /obj/item/pda/chameleon/syndicate(src) /obj/item/storage/box/syndie_kit/chameleon/plasmaman real_name = "chameleon kit" @@ -788,7 +787,6 @@ new /obj/item/storage/backpack/chameleon/syndicate(src) new /obj/item/radio/headset/chameleon/syndicate(src) new /obj/item/stamp/chameleon/syndicate(src) - new /obj/item/pda/chameleon/syndicate(src) //5*(2*4) = 5*8 = 45, 45 damage if you hit one person with all 5 stars. //Not counting the damage it will do while embedded (2*4 = 8, at 15% chance) @@ -841,7 +839,7 @@ new /obj/item/radio/headset/headset_cent/empty(src) new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/storage/backpack/satchel(src) - new /obj/item/pda/heads(src) + new /obj/item/modular_computer/tablet/pda/preset/bureaucrat(src) new /obj/item/clipboard(src) new /obj/item/implanter/mindshield(src) @@ -856,7 +854,6 @@ new /obj/item/storage/backpack/chameleon/broken(src) new /obj/item/radio/headset/chameleon/broken(src) new /obj/item/stamp/chameleon/broken(src) - new /obj/item/pda/chameleon/broken(src) // No chameleon laser, they can't randomise for //REASONS// /obj/item/storage/box/syndie_kit/bee_grenades diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index d7b7421bf7b5..5231e638f57c 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -33,6 +33,17 @@ var/preload_cell_type ///used for passive discharge var/cell_last_used = 0 + light_range = 1.5 + light_system = MOVABLE_LIGHT + light_on = FALSE + light_color = LIGHT_COLOR_ORANGE + light_power = 0.5 + +/// Toggles the stun baton's light +/obj/item/melee/baton/proc/toggle_light(mob/user) + set_light_on(!light_on) + return + /obj/item/melee/baton/get_cell() return cell @@ -76,6 +87,7 @@ if(status && cell.charge < hitcost) //we're below minimum, turn off status = FALSE + set_light_on(FALSE) update_appearance(UPDATE_ICON) playsound(loc, "sparks", 75, 1, -1) STOP_PROCESSING(SSobj, src) // no more charge? stop checking for discharge @@ -135,6 +147,8 @@ status = !status to_chat(user, span_notice("[src] is now [status ? "on" : "off"].")) playsound(loc, "sparks", 75, 1, -1) + toggle_light(user) + do_sparks(1, TRUE, src) cell_last_used = 0 if(status) START_PROCESSING(SSobj, src) @@ -156,6 +170,8 @@ user.Paralyze(stunforce*3) deductcharge(hitcost) return + if(!synth_check(user, SYNTH_RESTRICTED_WEAPON)) + return if(HAS_TRAIT(user, TRAIT_NO_STUN_WEAPONS)) to_chat(user, span_warning("You can't seem to remember how this works!")) return @@ -306,3 +322,5 @@ desc = "A new power management circuit which enables stun batons to instantly stun, at the cost of double power usage." icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade3" + + diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 0a981ca2ca74..ecee5b4ff520 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -74,6 +74,11 @@ air_contents = new(volume) //liters air_contents.set_temperature(T20C) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + populate_gas() START_PROCESSING(SSobj, src) @@ -367,8 +372,7 @@ //Assembly / attached device memes -/obj/item/tank/Crossed(atom/movable/AM) //for mousetraps - ..() +/obj/item/tank/proc/on_entered(datum/source, atom/movable/AM, ...) if(tank_assembly) tank_assembly.Crossed(AM) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index bf18b88163d7..29146217a564 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -391,7 +391,7 @@ add_overlay(filling) /obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE) //apply chemcolor and level - . = list() + . = ..() //inhands + reagent_filling if(!isinhands && reagents.total_volume) var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10") diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 027d16615440..83429cb1cdb2 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -62,6 +62,10 @@ item_state = "crowbar" toolspeed = 0.7 +/obj/item/crowbar/large/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack, no_multi_hit=TRUE) // it's big + /obj/item/crowbar/cyborg name = "hydraulic crowbar" desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs." diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 12a0bbacda73..14a8dbde4f24 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -4,8 +4,15 @@ icon = 'icons/obj/tools.dmi' icon_state = "screwdriver_map" item_state = "screwdriver" + belt_icon_state = "screwdriver" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + + greyscale_config = /datum/greyscale_config/screwdriver + greyscale_config_belt = /datum/greyscale_config/screwdriver_belt + greyscale_config_inhand_left = /datum/greyscale_config/screwdriver_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/screwdriver_inhand_right + flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT force = 5 @@ -18,21 +25,22 @@ attack_verb = list("stabbed") hitsound = 'sound/weapons/bladeslice.ogg' usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') + drop_sound = 'sound/items/handling/screwdriver_drop.ogg' + pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg' + tool_behaviour = TOOL_SCREWDRIVER toolspeed = 1 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) - drop_sound = 'sound/items/handling/screwdriver_drop.ogg' - pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg' sharpness = SHARP_POINTY var/random_color = TRUE //if the screwdriver uses random coloring var/static/list/screwdriver_colors = list( - "blue" = rgb(24, 97, 213), - "red" = rgb(255, 0, 0), - "pink" = rgb(213, 24, 141), - "brown" = rgb(160, 82, 18), - "green" = rgb(14, 127, 27), - "cyan" = rgb(24, 162, 213), - "yellow" = rgb(255, 165, 0) + COLOR_TOOL_BLUE, + COLOR_TOOL_RED, + COLOR_TOOL_PINK, + COLOR_TOOL_BROWN, + COLOR_TOOL_GREEN, + COLOR_TOOL_CYAN, + COLOR_TOOL_YELLOW, ) /obj/item/screwdriver/suicide_act(mob/user) @@ -42,38 +50,10 @@ /obj/item/screwdriver/Initialize(mapload) . = ..() if(random_color) //random colors! - icon_state = "screwdriver" - var/our_color = pick(screwdriver_colors) - add_atom_colour(screwdriver_colors[our_color], FIXED_COLOUR_PRIORITY) - update_appearance(UPDATE_ICON) + set_greyscale(colors = list(pick(screwdriver_colors))) if(prob(75)) pixel_y = rand(0, 16) -/obj/item/screwdriver/update_overlays() - . = ..() - if(!random_color) //icon override - return - var/mutable_appearance/base_overlay = mutable_appearance(icon, "screwdriver_screwybits") - base_overlay.appearance_flags = RESET_COLOR - . += base_overlay - -/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file) - . = list() - if(isinhands && random_color) - var/mutable_appearance/M = mutable_appearance(icon_file, "screwdriver_head") - M.appearance_flags = RESET_COLOR - . += M - -/obj/item/screwdriver/get_belt_overlay() - if(random_color) - var/mutable_appearance/body = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver") - var/mutable_appearance/head = mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_head") - body.color = color - head.add_overlay(body) - return head - else - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', icon_state) - /obj/item/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user) if(!(user.a_intent == INTENT_HARM) && attempt_initiate_surgery(src, M, user)) return @@ -81,6 +61,8 @@ return ..() if(user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_HEAD) return ..() + if(!synth_check(user, SYNTH_ORGANIC_HARM)) + return if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm [M]!")) return @@ -107,9 +89,6 @@ toolspeed = 0.1 random_color = FALSE -/obj/item/screwdriver/abductor/get_belt_overlay() - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "screwdriver_alien") - /obj/item/screwdriver/cyborg name = "powered screwdriver" desc = "An electrical screwdriver, designed to be both precise and quick." @@ -121,6 +100,7 @@ desc = "Crude driver of screws. A primitive way to screw things up." icon = 'icons/obj/improvised.dmi' icon_state = "screwdriver_makeshift" + item_state = "screwdriver_makeshift" toolspeed = 2 random_color = FALSE diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 71ef647c6171..d1ab907125b8 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -6,6 +6,12 @@ item_state = "cutters" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + + greyscale_config = /datum/greyscale_config/wirecutters + greyscale_config_belt = /datum/greyscale_config/wirecutters_belt_overlay + greyscale_config_inhand_left = /datum/greyscale_config/wirecutter_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/wirecutter_inhand_right + flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT force = 6 @@ -24,31 +30,20 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30) var/random_color = TRUE var/static/list/wirecutter_colors = list( - "blue" = "#1861d5", - "red" = "#951710", - "pink" = "#d5188d", - "brown" = "#a05212", - "green" = "#0e7f1b", - "cyan" = "#18a2d5", - "yellow" = "#d58c18" + COLOR_TOOL_BLUE, + COLOR_TOOL_RED, + COLOR_TOOL_PINK, + COLOR_TOOL_BROWN, + COLOR_TOOL_GREEN, + COLOR_TOOL_CYAN, + COLOR_TOOL_YELLOW, ) /obj/item/wirecutters/Initialize(mapload) . = ..() if(random_color) //random colors! - icon_state = "cutters" - var/our_color = pick(wirecutter_colors) - add_atom_colour(wirecutter_colors[our_color], FIXED_COLOUR_PRIORITY) - update_appearance(UPDATE_ICON) - -/obj/item/wirecutters/update_overlays() - . = ..() - if(!random_color) //icon override - return - var/mutable_appearance/base_overlay = mutable_appearance(icon, "cutters_cutty_thingy") - base_overlay.appearance_flags = RESET_COLOR - . += base_overlay + set_greyscale(colors = list(pick(wirecutter_colors))) /obj/item/wirecutters/attack(mob/living/carbon/C, mob/user) if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/restraints/handcuffs/cable)) @@ -80,6 +75,7 @@ desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch." resistance_flags = FIRE_PROOF | ACID_PROOF icon_state = "cutters_brass" + item_state = "cutters_brass" random_color = FALSE toolspeed = 0.5 @@ -88,6 +84,7 @@ desc = "Extremely sharp wirecutters, made out of a silvery-green metal." icon = 'icons/obj/abductor.dmi' icon_state = "cutters_alien" + item_state = "cutters_alien" toolspeed = 0.1 random_color = FALSE @@ -102,6 +99,7 @@ desc = "Mind your fingers." icon = 'icons/obj/improvised.dmi' icon_state = "cutters_makeshift" + item_state = "cutters_makeshift" toolspeed = 0.5 random_color = FALSE diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 3a3da7c3be55..9cfe1022c7ac 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -456,6 +456,14 @@ w_class = WEIGHT_CLASS_TINY var/ash_type = /obj/effect/decal/cleanable/ash +/obj/item/toy/snappop/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + + /obj/item/toy/snappop/proc/pop_burst(n=3, c=1) var/datum/effect_system/spark_spread/s = new() s.set_up(n, c, src) @@ -473,8 +481,7 @@ if(!..()) pop_burst() -/obj/item/toy/snappop/Crossed(H as mob|obj) - . = ..() +/obj/item/toy/snappop/proc/on_entered(datum/source, atom/movable/H, ...) if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 48f8af00a690..ddcdb6ba0bf0 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -46,7 +46,7 @@ /obj/item/trash/plate name = "plate" - desc = "a relic from a forgotten time... I miss eating off of plates..." + desc = "A relic from a forgotten time... I miss eating off of plates..." icon_state = "plate" resistance_flags = NONE diff --git a/code/game/objects/items/two_handed/baseball_bat.dm b/code/game/objects/items/two_handed/baseball_bat.dm index 2f6dbb3153c1..400a7bbcd90a 100644 --- a/code/game/objects/items/two_handed/baseball_bat.dm +++ b/code/game/objects/items/two_handed/baseball_bat.dm @@ -21,6 +21,7 @@ /obj/item/melee/baseball_bat/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, require_twohands = TRUE) + AddComponent(/datum/component/cleave_attack, arc_size=90, requires_wielded=TRUE, no_multi_hit=TRUE) /obj/item/melee/baseball_bat/homerun name = "home run bat" diff --git a/code/game/objects/items/two_handed/chainsaw.dm b/code/game/objects/items/two_handed/chainsaw.dm index 9aa4aa9affe9..aa801f98c3eb 100644 --- a/code/game/objects/items/two_handed/chainsaw.dm +++ b/code/game/objects/items/two_handed/chainsaw.dm @@ -26,6 +26,7 @@ /obj/item/melee/chainsaw/Initialize(mapload) . = ..() + AddComponent(/datum/component/cleave_attack) AddComponent(/datum/component/two_handed, require_twohands = TRUE) AddComponent(/datum/component/butchering, 30, 100, 0, 'sound/weapons/chainsawhit.ogg', TRUE) diff --git a/code/game/objects/items/two_handed/dualsaber.dm b/code/game/objects/items/two_handed/dualsaber.dm index e369a884d41c..a91dedaf6052 100644 --- a/code/game/objects/items/two_handed/dualsaber.dm +++ b/code/game/objects/items/two_handed/dualsaber.dm @@ -57,6 +57,7 @@ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ ) + AddComponent(/datum/component/cleave_attack, arc_size=360, swing_speed_mod=1.5, requires_wielded=TRUE) // lol, lmao even /obj/item/melee/dualsaber/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/two_handed/fireaxe.dm b/code/game/objects/items/two_handed/fireaxe.dm index 16b1bc27484d..0d726252caac 100644 --- a/code/game/objects/items/two_handed/fireaxe.dm +++ b/code/game/objects/items/two_handed/fireaxe.dm @@ -29,6 +29,7 @@ force_wielded = force_wielded, \ icon_wielded = "[base_icon_state]1", \ ) + AddComponent(/datum/component/cleave_attack, arc_size=180, requires_wielded=TRUE) // YEAHHHHH AddComponent(/datum/component/butchering, 100, 80, 0 , hitsound) //axes are not known for being precision butchering tools /obj/item/fireaxe/update_icon_state() @@ -45,7 +46,7 @@ return if(QDELETED(A)) return - if(HAS_TRAIT(src, TRAIT_WIELDED)) //destroys shit faster, generally in 1-2 hits. + if(HAS_TRAIT(src, TRAIT_WIELDED) && !HAS_TRAIT(src, TRAIT_CLEAVING)) //destroys shit faster, generally in 1-2 hits. if(istype(A, /obj/structure/window)) var/obj/structure/window/W = A W.take_damage(W.max_integrity*2, BRUTE, MELEE, FALSE, null, armour_penetration) diff --git a/code/game/objects/items/two_handed/highfrequencyblade.dm b/code/game/objects/items/two_handed/highfrequencyblade.dm index 40cd8a0c1a18..c1341fcd7ae0 100644 --- a/code/game/objects/items/two_handed/highfrequencyblade.dm +++ b/code/game/objects/items/two_handed/highfrequencyblade.dm @@ -23,6 +23,7 @@ force_wielded = 20, \ icon_wielded = "[base_icon_state]1", \ ) + AddComponent(/datum/component/cleave_attack, requires_wielded=TRUE) AddComponent(/datum/component/butchering, 20, 105) /obj/item/vibro_weapon/update_icon_state() diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 9fd276f6ef92..82681c1a609e 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -74,6 +74,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/Initialize(mapload) . = ..() + AddComponent(/datum/component/cleave_attack, arc_size=90) AddComponent(/datum/component/butchering, 40, 105) /obj/item/claymore/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) @@ -259,9 +260,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF +/obj/item/katana/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack) + /obj/item/katana/basalt name = "basalt katana" - desc = "a katana made out of hardened basalt. Particularly damaging to lavaland fauna. (Activate this item in hand to dodge roll in the direction you're facing)" + desc = "A katana made of hardened basalt. Particularly damaging to lavaland fauna.
(Activate this item in hand to dodge roll in the direction you're facing)" icon_state = "basalt_katana" item_state = "basalt_katana" force = 18 @@ -584,6 +589,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/mounted_chainsaw/Initialize(mapload) . = ..() + AddComponent(/datum/component/cleave_attack) ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT) /obj/item/mounted_chainsaw/Destroy() diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 223f2cc4c414..3d4fbc18d032 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -1,53 +1,4 @@ -///the essential proc to call when an obj must receive damage of any kind. -/obj/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) - if(QDELETED(src)) - stack_trace("[src] taking damage after deletion") - return - if(sound_effect) - play_attack_sound(damage_amount, damage_type, damage_flag) - if(!(resistance_flags & INDESTRUCTIBLE) && obj_integrity > 0) - damage_amount = run_obj_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration) - if(damage_amount >= DAMAGE_PRECISION) - . = damage_amount - var/old_integ = obj_integrity - obj_integrity = max(old_integ - damage_amount, 0) - if(obj_integrity <= 0) - var/int_fail = integrity_failure - if(int_fail && old_integ > int_fail) - obj_break(damage_flag) - obj_destruction(damage_flag) - else if(integrity_failure) - if(obj_integrity <= integrity_failure) - obj_break(damage_flag) - -///returns the damage value of the attack after processing the obj's various armor protections -/obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) - if(damage_flag == MELEE && damage_amount < damage_deflection) - return FALSE - switch(damage_type) - if(BRUTE) - if(BURN) - else - return FALSE - var/armor_protection = 0 - if(damage_flag) - armor_protection = armor.getRating(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) - -///the sound played when the obj is damaged. -/obj/proc/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - else - playsound(src, 'sound/weapons/tap.ogg', 50, 1) - if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) - /obj/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) ..() if(isobj(AM)) @@ -63,32 +14,18 @@ if(QDELETED(src)) return if(target == src) - obj_integrity = 0 + update_integrity(0) qdel(src) return switch(severity) if(1) - obj_integrity = 0 + update_integrity(0) qdel(src) if(2) take_damage(rand(100, 250), BRUTE, BOMB, 0) if(3) take_damage(rand(10, 90), BRUTE, BOMB, 0) -/obj/bullet_act(obj/projectile/P) - . = ..() - playsound(src, P.hitsound, 50, 1) - visible_message(span_danger("[src] is hit by \a [P]!"), null, null, COMBAT_MESSAGE_RANGE) - if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object - var/demolition_mult = P.demolition_mod - if(istype(src, /obj/mecha) && P.demolition_mod != 1) //snowflake damage checks for mechs - demolition_mult = istype(src, /obj/mecha/combat) ? min(1, (1 + P.demolition_mod)/2) : (1 + P.demolition_mod)/2 - take_damage(P.damage * demolition_mult, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armour_penetration) - -///Called to get the damage that hulks will deal to the obj. -/obj/proc/hulk_damage() - return 150 //the damage hulks do on punches to this object, is affected by melee armor - /obj/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(user.a_intent == INTENT_HARM) ..(user, 1) @@ -109,11 +46,6 @@ return take_damage(400, BRUTE, MELEE, 0, get_dir(src, B)) -/obj/proc/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, armor_penetration = 0) //used by attack_alien, attack_animal, and attack_slime - user.do_attack_animation(src) - user.changeNext_move(CLICK_CD_MELEE) - return take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration) - /obj/attack_alien(mob/living/carbon/alien/humanoid/user) if(attack_generic(user, 60, BRUTE, MELEE, 0)) playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) @@ -149,33 +81,6 @@ return attack_generic(user, rand(10, 15), BRUTE, MELEE, 1) -/obj/mech_melee_attack(obj/mecha/M, equip_allowed) - M.do_attack_animation(src) - var/play_soundeffect = 0 - var/mech_damtype = M.damtype - if(M.selected) - mech_damtype = M.selected.damtype - play_soundeffect = 1 - else - switch(M.damtype) - if(BRUTE) - if(M.meleesound) - playsound(src, 'sound/weapons/punch4.ogg', 50, 1) - if(BURN) - if(M.meleesound) - playsound(src, 'sound/items/welder.ogg', 50, 1) - if(TOX) - if(M.meleesound) - playsound(src, 'sound/effects/spray2.ogg', 50, 1) - return 0 - else - return 0 - visible_message(span_danger("[M.name] has hit [src]."), null, null, COMBAT_MESSAGE_RANGE) - if(istype(src, /obj/mecha)) - return take_damage(M.force*1.5, mech_damtype, MELEE, play_soundeffect, get_dir(src, M)) //1.5x damage versus other mechs - else - return take_damage(M.force*3, mech_damtype, MELEE, play_soundeffect, get_dir(src, M)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. - /obj/singularity_act() SSexplosions.high_mov_atom += src if(src && !QDELETED(src)) @@ -270,12 +175,8 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e SEND_SIGNAL(src, COMSIG_OBJ_DECONSTRUCT, disassembled) qdel(src) -///called after the obj takes damage and integrity is below integrity_failure level -/obj/proc/obj_break(damage_flag) - return - ///what happens when the obj's integrity reaches zero. -/obj/proc/obj_destruction(damage_flag) +/obj/atom_destruction(damage_flag) if(damage_flag == ACID) acid_melt() else if(damage_flag == FIRE) @@ -283,26 +184,6 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e else deconstruct(FALSE) -///changes max_integrity while retaining current health percentage, returns TRUE if the obj got broken. -/obj/proc/modify_max_integrity(new_max, can_break = TRUE, damage_type = BRUTE, new_failure_integrity = null) - var/current_integrity = obj_integrity - var/current_max = max_integrity - - if(current_integrity != 0 && current_max != 0) - var/percentage = current_integrity / current_max - current_integrity = max(1, round(percentage * new_max)) //don't destroy it as a result - obj_integrity = current_integrity - - max_integrity = new_max - - if(new_failure_integrity != null) - integrity_failure = new_failure_integrity - - if(can_break && integrity_failure && current_integrity <= integrity_failure) - obj_break(damage_type) - return TRUE - return FALSE - ///returns how much the object blocks an explosion. Used by subtypes. /obj/proc/GetExplosionBlock() CRASH("Unimplemented GetExplosionBlock()") diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fcf51990e00a..fa56c1280d06 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,6 +2,8 @@ /obj animate_movement = 2 speech_span = SPAN_ROBOT + uses_integrity = TRUE + var/obj_flags = CAN_BE_HIT var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. @@ -18,17 +20,8 @@ var/bare_wound_bonus = 0 /// Damage multiplier against structures, machines, mechs, and to a lesser extent silicons var/demolition_mod = 1 - - var/datum/armor/armor - var/obj_integrity //defaults to max_integrity - var/max_integrity = 500 - var/integrity_failure = 0 //0 if we have no special broken behavior - ///Damage under this value will be completely ignored - var/damage_deflection = 0 - - var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF - - var/acid_level = 0 //how much acid is on that obj + /// How much acid is on this object + var/acid_level = 0 var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. var/current_skin //Has the item been reskinned? @@ -58,15 +51,6 @@ /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(mapload)") - - if(obj_integrity == null) - obj_integrity = max_integrity if (set_obj_flags) var/flagslist = splittext(set_obj_flags,";") var/list/string_to_objflag = GLOB.bitfields["obj_flags"] @@ -80,7 +64,6 @@ var/turf/T = loc T.add_blueprints_preround(src) - /obj/Destroy(force=FALSE) if(!ismachinery(src)) STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists @@ -279,9 +262,10 @@ 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], fire: [armor.fire], acid: [armor.acid]") - message_admins(span_notice("[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], fire: [armor.fire], acid: [armor.acid]")) + acid = text2num(result["values"][ACID]),\ + electric = text2num(result["values"][ELECTRIC])) + 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], fire: [armor.fire], acid: [armor.acid], electric: [armor.electric]") + message_admins(span_notice("[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], fire: [armor.fire], acid: [armor.acid], electric: [armor.electric]")) if(href_list[VV_HK_MASS_DEL_TYPE]) if(check_rights(R_DEBUG|R_SERVER)) var/action_type = tgui_alert(usr, "Strict type ([type]) or type and all subtypes?",,list("Strict type","Type and subtypes","Cancel")) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index e8f1536364aa..5583f0894af6 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -42,20 +42,6 @@ . += span_warning("It's on fire!") if(broken) . += span_notice("It appears to be broken.") - var/examine_status = examine_status(user) - if(examine_status) - . += examine_status - -/obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls. - var/healthpercent = (obj_integrity/max_integrity) * 100 - switch(healthpercent) - if(50 to 99) - return "It looks slightly damaged." - if(25 to 50) - return "It appears heavily damaged." - if(0 to 25) - if(!broken) - return span_warning("It's falling apart!") /obj/structure/rust_heretic_act() take_damage(500, BRUTE, MELEE, 1) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 2ba38d37d2f8..1450dfd86fe4 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -11,7 +11,7 @@ icon = 'icons/mob/alien.dmi' max_integrity = 100 -/obj/structure/alien/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/obj/structure/alien/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE) switch(damage_type) if(BRUTE) @@ -256,7 +256,7 @@ addtimer(CALLBACK(src, PROC_REF(Grow)), rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME)) proximity_monitor = new(src, status == GROWN ? 1 : 0) if(status == BURST) - obj_integrity = integrity_failure + update_integrity(integrity_failure) /obj/structure/alien/egg/update_icon_state() . = ..() @@ -324,7 +324,8 @@ child.Leap(M) break -/obj/structure/alien/egg/obj_break(damage_flag) +/obj/structure/alien/egg/atom_break(damage_flag) + . = ..() if(!(flags_1 & NODECONSTRUCT_1)) if(status != BURST) Burst(kill=TRUE) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b6c2a0a6c464..5d6681c4ecf5 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -26,7 +26,7 @@ GLOBAL_LIST_EMPTY(lockers) var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet. var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients. - var/cutting_tool = /obj/item/weldingtool + var/cutting_tool = TOOL_WELDER var/open_sound = 'sound/machines/click.ogg' var/close_sound = 'sound/machines/click.ogg' var/material_drop = /obj/item/stack/sheet/metal @@ -316,75 +316,75 @@ GLOBAL_LIST_EMPTY(lockers) new material_drop(loc, material_drop_amount) qdel(src) -/obj/structure/closet/obj_break(damage_flag) +/obj/structure/closet/atom_break(damage_flag) + . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) bust_open() -/obj/structure/closet/attackby(obj/item/W, mob/user, params) +/obj/structure/closet/attackby(obj/item/attacking_item, mob/user, params) if(user in src) return - if(src.tool_interact(W,user)) - return 1 // No afterattack - else + if(user.a_intent == INTENT_HARM) return ..() + if(attacking_item.GetID()) + togglelock(user) + return TRUE + if(user.transferItemToLoc(attacking_item, drop_location())) + return TRUE -/obj/structure/closet/proc/tool_interact(obj/item/W, mob/user)//returns TRUE if attackBy call shouldnt be continued (because tool was used/closet was of wrong type), FALSE if otherwise - . = TRUE - if(opened) - if(user.a_intent == INTENT_HARM) - return FALSE - if(istype(W, cutting_tool)) - if(W.tool_behaviour == TOOL_WELDER) - if(!W.tool_start_check(user, amount=0)) - return - - to_chat(user, span_notice("You begin cutting \the [src] apart...")) - if(W.use_tool(src, user, 40, volume=50)) - if(!opened) - return - user.visible_message(span_notice("[user] slices apart \the [src]."), - span_notice("You cut \the [src] apart with \the [W]."), - span_italics("You hear welding.")) - deconstruct(TRUE) - return - else // for example cardboard box is cut with wirecutters - user.visible_message(span_notice("[user] cut apart \the [src]."), \ - span_notice("You cut \the [src] apart with \the [W].")) - deconstruct(TRUE) - return - if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too - return - else if(W.tool_behaviour == TOOL_WELDER && can_weld_shut) - if(!W.tool_start_check(user, amount=0)) - return - +/obj/structure/closet/welder_act(mob/living/user, obj/item/tool) + if(user.a_intent == INTENT_HARM) + return FALSE + if(!tool.tool_start_check(user, amount=0)) + return FALSE + if(opened && !(flags_1 & NODECONSTRUCT_1)) + if(tool.tool_behaviour != cutting_tool) + return FALSE // the wrong tool + to_chat(user, span_notice("You begin cutting \the [src] apart...")) + if(tool.use_tool(src, user, 4 SECONDS, volume=50)) + if(!opened) + return TRUE + user.visible_message(span_notice("[user] slices apart \the [src]."), + span_notice("You cut \the [src] apart with \the [tool]."), + span_italics("You hear welding.")) + deconstruct(TRUE) + return TRUE + if(can_weld_shut) to_chat(user, span_notice("You begin [welded ? "unwelding":"welding"] \the [src]...")) - if(W.use_tool(src, user, 40, volume=50)) + if(tool.use_tool(src, user, 4 SECONDS, volume=50)) if(opened) return welded = !welded after_weld(welded) update_airtightness() user.visible_message(span_notice("[user] [welded ? "welds shut" : "unwelded"] \the [src]."), - span_notice("You [welded ? "weld" : "unwelded"] \the [src] with \the [W]."), - span_italics("You hear welding.")) + span_notice("You [welded ? "weld" : "unwelded"] \the [src] with \the [tool]."), + span_italics("You hear welding.")) update_appearance() - else if(W.tool_behaviour == TOOL_WRENCH && anchorable) - if(isinspace() && !anchored) - return - setAnchored(!anchored) - W.play_tool_sound(src, 75) - user.visible_message(span_notice("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground."), \ - span_notice("You [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground."), \ - span_italics("You hear a ratchet.")) - else if(user.a_intent != INTENT_HARM) - var/item_is_id = W.GetID() - if(!item_is_id && !(W.item_flags & NOBLUDGEON)) - return FALSE - if(item_is_id || !toggle(user)) - togglelock(user) - else + return TRUE + return FALSE + +/obj/structure/closet/wirecutter_act(mob/living/user, obj/item/tool) + if(user.a_intent == INTENT_HARM || (flags_1 & NODECONSTRUCT_1)) return FALSE + if(tool.tool_behaviour != cutting_tool) + return FALSE + user.visible_message(span_notice("[user] cut apart \the [src]."), \ + span_notice("You cut \the [src] apart with \the [tool].")) + deconstruct(TRUE) + return TRUE + +/obj/structure/closet/wrench_act(mob/living/user, obj/item/tool) + if(!anchorable) + return FALSE + if(isinspace() && !anchored) + return FALSE + setAnchored(!anchored) + tool.play_tool_sound(src, 75) + user.visible_message(span_notice("[user] [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground."), \ + span_notice("You [anchored ? "anchored" : "unanchored"] \the [src] [anchored ? "to" : "from"] the ground."), \ + span_italics("You hear a ratchet.")) + return TRUE /obj/structure/closet/proc/after_weld(weld_state) return @@ -615,15 +615,18 @@ GLOBAL_LIST_EMPTY(lockers) if(!open(user)) to_chat(user, span_warning("It won't budge!")) return + density = FALSE //otherwise it's impossible to step toward (it becomes dense again when closed) step_towards(user, T2) + if(dense_when_open) + density = TRUE T1 = get_turf(user) if(T1 == T2) - user.resting = TRUE //so people can jump into crates without slamming the lid on their head + user.density = FALSE //so people can jump into crates without slamming the lid on their head if(!close(user)) to_chat(user, span_warning("You can't get [src] to close!")) - user.resting = FALSE + user.density = TRUE return - user.resting = FALSE + user.density = TRUE togglelock(user) T1.visible_message(span_warning("[user] dives into [src]!")) diff --git a/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm b/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm index f43afb5fcb7c..6985debc4a1a 100644 --- a/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm +++ b/code/game/objects/structures/crates_lockers/closets/bluespace_locker.dm @@ -28,7 +28,9 @@ desc = "" cutting_tool = null can_weld_shut = FALSE + anchorable = FALSE anchored = TRUE + flags_1 = NODECONSTRUCT_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF var/list/mirage_whitelist = list() @@ -54,9 +56,6 @@ return TRUE return other.can_open(user) -/obj/structure/closet/bluespace/internal/tool_interact(obj/item/W, mob/user) - return - /obj/structure/closet/bluespace/internal/attack_hand(mob/living/user) var/obj/structure/closet/other = get_other_locker() if(!other) diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 9b0bd4e4a69f..c74d91bda453 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -8,7 +8,7 @@ max_integrity = 70 integrity_failure = 0 can_weld_shut = 0 - cutting_tool = /obj/item/wirecutters + cutting_tool = TOOL_WIRECUTTER open_sound = "rustle" material_drop = /obj/item/stack/sheet/cardboard delivery_icon = "deliverybox" @@ -77,7 +77,7 @@ mob_storage_capacity = 5 resistance_flags = NONE move_speed_multiplier = 2 - cutting_tool = /obj/item/weldingtool + cutting_tool = TOOL_WELDER open_sound = 'sound/machines/click.ogg' material_drop = /obj/item/stack/sheet/plasteel #undef SNAKE_SPAM_TICKS diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index e2aaf3c621cb..95f6e78e242f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -6,7 +6,6 @@ /obj/structure/closet/secure_closet/engineering_chief/PopulateContents() ..() new /obj/item/tank/jetpack/suit(src) - new /obj/item/cartridge/ce(src) new /obj/item/radio/headset/heads/ce(src) new /obj/item/storage/toolbox/mechanical(src) new /obj/item/megaphone/command(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 3fc060b7b56d..3442c3fd4dc3 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -52,7 +52,6 @@ /obj/structure/closet/secure_closet/CMO/PopulateContents() ..() new /obj/item/storage/backpack/duffelbag/med(src) - new /obj/item/cartridge/cmo(src) new /obj/item/radio/headset/heads/cmo(src) new /obj/item/megaphone/command(src) new /obj/item/clothing/neck/cloak/cmo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index c1c6770f8199..e3a3805e111a 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -5,7 +5,6 @@ /obj/structure/closet/secure_closet/RD/PopulateContents() ..() - new /obj/item/cartridge/rd(src) new /obj/item/clothing/gloves/color/latex(src) new /obj/item/radio/headset/heads/rd(src) new /obj/item/tank/internals/air(src) 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 7ddc6c9f6cf1..bc9ad0944d95 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 @@ -8,7 +8,7 @@ secure = TRUE var/obj/item/electronics/airlock/electronics -/obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/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/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 12a29dddd2fe..9faf5a0bd907 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -7,7 +7,6 @@ ..() new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) - new /obj/item/cartridge/captain(src) new /obj/item/storage/box/silver_ids(src) new /obj/item/clothing/neck/cloak/cap(src) new /obj/item/radio/headset/heads/captain/alt(src) @@ -27,7 +26,6 @@ /obj/structure/closet/secure_closet/hop/PopulateContents() ..() new /obj/item/storage/lockbox/medal/service(src) - new /obj/item/cartridge/hop(src) new /obj/item/radio/headset/heads/hop(src) new /obj/item/storage/box/ids(src) new /obj/item/storage/box/ids(src) @@ -53,7 +51,6 @@ /obj/structure/closet/secure_closet/hos/PopulateContents() ..() - new /obj/item/cartridge/hos(src) new /obj/item/radio/headset/heads/hos/alt(src) new /obj/item/radio/headset/heads/hos(src) new /obj/item/storage/lockbox/medal/sec(src) @@ -312,7 +309,6 @@ /obj/structure/closet/secure_closet/physician/PopulateContents() ..() new /obj/item/storage/backpack/duffelbag/clothing/sec/physician(src) - new /obj/item/cartridge/medical(src) new /obj/item/radio/headset/headset_medsec(src) new /obj/item/storage/belt/medical(src) new /obj/item/pinpointer/crew(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 9131598b2453..98c6a401ebbe 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -25,7 +25,7 @@ new /obj/item/storage/box/flashbangs(src) new /obj/item/storage/box/teargas(src) new /obj/item/storage/backpack/duffelbag/syndie/med(src) - new /obj/item/modular_computer/tablet/pda/preset/basic/syndicate(src) + new /obj/item/modular_computer/tablet/pda/preset/syndicate(src) /obj/structure/closet/syndicate/resources desc = "An old, dusty locker." diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index 7bfef142fb45..ebcbe30d7fdd 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -8,7 +8,7 @@ armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80) var/tamperproof = 0 -/obj/structure/closet/crate/secure/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/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 . = ..() diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 97c4a5f2cb50..d3faf88659d4 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -69,7 +69,8 @@ trigger_alarm() qdel(src) -/obj/structure/displaycase/obj_break(damage_flag) +/obj/structure/displaycase/atom_break(damage_flag) + . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) density = FALSE broken = 1 @@ -108,13 +109,13 @@ else to_chat(user, span_alert("Access denied.")) else if(W.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!W.tool_start_check(user, amount=5)) return to_chat(user, span_notice("You begin repairing [src]...")) if(W.use_tool(src, user, 40, amount=5, volume=50)) - obj_integrity = max_integrity + update_integrity(max_integrity) update_appearance(UPDATE_ICON) to_chat(user, span_notice("You repair [src].")) else @@ -149,7 +150,7 @@ if(do_after(user, 2 SECONDS, src)) G.use(2) broken = 0 - obj_integrity = max_integrity + update_integrity(max_integrity) update_appearance(UPDATE_ICON) else return ..() @@ -238,7 +239,7 @@ /obj/structure/displaycase/captain/attackby(obj/item/W, mob/user, params) // Unless shit has really hit the fan. if(!istype(W, /obj/item/card/id)) return ..() - if(seclevel2num(get_security_level()) >= SEC_LEVEL_GAMMA) // Everything higher than red. + if(SSsecurity_level.get_current_level_as_number()>= SEC_LEVEL_GAMMA) // Everything higher than red. req_access = list(ACCESS_CAPTAIN) else to_chat(user, span_warning("The display case's access locks can only be lifted above red alert!")) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 26ffaa271b51..30b8a116b360 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -319,7 +319,7 @@ qdel(src) /obj/structure/door_assembly/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_DECONSTRUCT) + if(the_rcd.construction_mode == RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) return FALSE diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 0717cf5c51ed..9a3f47834a26 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -133,7 +133,8 @@ else icon_state = "extinguisher_empty" -/obj/structure/extinguisher_cabinet/obj_break(damage_flag) +/obj/structure/extinguisher_cabinet/atom_break(damage_flag) + . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) broken = 1 opened = 1 diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 1ef8a1203a87..c02ebde19373 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -26,6 +26,7 @@ var/walltype = /turf/closed/wall var/girder_type = /obj/structure/girder/displaced var/opening = FALSE + var/fake_examine_message = span_notice("The outer plating is welded firmly in place.") /obj/structure/falsewall/Initialize(mapload) @@ -155,8 +156,9 @@ /obj/structure/falsewall/get_dumping_location(obj/item/storage/source,mob/user) return null -/obj/structure/falsewall/examine_status(mob/user) //So you can't detect falsewalls by examine. - return span_notice("The outer plating is welded firmly in place.") +/obj/structure/falsewall/examine(mob/user) //So you can't detect falsewalls by examine. + . = ..() + . += fake_examine_message /obj/structure/falsewall/CanAStarPass(ID, dir, caller) . = ..() @@ -179,9 +181,7 @@ walltype = /turf/closed/wall/r_wall mineral = /obj/item/stack/sheet/plasteel smoothing_flags = SMOOTH_BITMASK - -/obj/structure/falsewall/reinforced/examine_status(mob/user) - return span_notice("The outer grille is fully intact.") + fake_examine_message = span_notice("The outer grille is fully intact.") /obj/structure/falsewall/reinforced/attackby(obj/item/tool, mob/user) ..() @@ -429,7 +429,7 @@ /obj/structure/falsewall/brass/ratvar_act() if(GLOB.ratvar_awakens) - obj_integrity = max_integrity + update_integrity(max_integrity) /obj/structure/falsewall/material name = "wall" diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 0daff6818cde..bc7b9e33c71b 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -39,12 +39,12 @@ return if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP && !broken) //Repairing light damage with a welder - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!I.tool_start_check(user, amount=2)) return to_chat(user, span_notice("You begin repairing [src].")) if(I.use_tool(src, user, 40, volume=50, amount=2)) - obj_integrity = max_integrity + update_integrity(max_integrity) update_appearance(UPDATE_ICON) to_chat(user, span_notice("You repair [src].")) else @@ -59,7 +59,7 @@ to_chat(user, span_notice("You start fixing [src]...")) if(do_after(user, 2 SECONDS, src) && G.use(2)) broken = 0 - obj_integrity = max_integrity + update_integrity(max_integrity) update_appearance(UPDATE_ICON) //yogs start - warn user if they use the wrong type of glass to repair else if(istype(I, /obj/item/stack/sheet/glass) && broken) @@ -134,7 +134,8 @@ if(.) update_appearance(UPDATE_ICON) -/obj/structure/fireaxecabinet/obj_break(damage_flag) +/obj/structure/fireaxecabinet/atom_break(damage_flag) + . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) update_appearance(UPDATE_ICON) broken = TRUE @@ -212,7 +213,7 @@ if(open) . += "glass_raised" return - var/hp_percent = obj_integrity/max_integrity * 100 + var/hp_percent = atom_integrity/max_integrity * 100 if(broken) . += "glass4" else diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 399d554f2102..dacc3d258f2f 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -201,3 +201,12 @@ anchored = TRUE density = TRUE deconstructible = FALSE + +/obj/structure/fluff/colton_statue //Memorial statue of Colton Oppenheimer/AutisticFroggy + name = "statue of colton oppenheimer" + desc = "https://wiki.yogstation.net/wiki/User:Autisticfroggy/The_Last_Lecture" + icon = 'icons/obj/3x3.dmi' + icon_state = "colton" + pixel_x = -1 + density = TRUE + deconstructible = FALSE \ No newline at end of file diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index be778330de37..3001482156ef 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -543,9 +543,7 @@ GLOBAL_LIST_EMPTY(servant_golem_users) implants = list(/obj/item/implant/weapons_auth) id = /obj/item/card/id/syndicate back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) + box = /obj/item/storage/box/survival/syndie /datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H) H.faction |= ROLE_SYNDICATE @@ -563,9 +561,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) r_pocket = /obj/item/kitchen/knife/combat/survival belt = /obj/item/storage/belt/military/assault back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/battlecruiser/assault name = "Syndicate Battlecruiser Assault Operative" @@ -584,9 +579,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) suit_store = /obj/item/gun/ballistic/automatic/pistol back = /obj/item/storage/backpack/security mask = /obj/item/clothing/mask/gas/syndicate - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/battlecruiser/captain name = "Syndicate Battlecruiser Captain" @@ -606,9 +598,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) head = /obj/item/clothing/head/HoS/syndicate mask = /obj/item/clothing/mask/cigarette/cigar/havana glasses = /obj/item/clothing/glasses/thermal/eyepatch - backpack_contents = list( - /obj/item/storage/box/syndie - ) //Icemoon Syndicate. Players become research agents working under a Syndicate research station. /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate //generic version @@ -628,9 +617,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) mask = /obj/item/clothing/mask/gas/syndicate id = /obj/item/card/id/syndicate/anyone back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/security name = "Syndicate Outpost Security Officer" @@ -647,9 +633,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) belt = /obj/item/storage/belt/security/full //take like one guy alive glasses = /obj/item/clothing/glasses/hud/security/sunglasses //identify the job of whoever the fuck is breaking in at a glance back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/sci name = "Syndicate Outpost Researcher" @@ -665,9 +648,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) accessory = /obj/item/clothing/accessory/armband/science glasses = /obj/item/clothing/glasses/hud/diagnostic/sunglasses/rd //it's a syndicate nerd back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/engineer name = "Syndicate Outpost Engineer" @@ -684,9 +664,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) accessory = /obj/item/clothing/accessory/armband/engine glasses = /obj/item/clothing/glasses/meson/sunglasses/ce back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/medic name = "Syndicate Outpost Doctor" @@ -702,9 +679,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) glasses = /obj/item/clothing/glasses/hud/health/sunglasses/cmo //rapid hurt and chemical identification accessory = /obj/item/clothing/accessory/armband/medblue back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) /obj/effect/mob_spawn/human/syndicate/icemoon_syndicate/commander name = "Syndicate Outpost Commander" @@ -727,7 +701,6 @@ GLOBAL_LIST_EMPTY(servant_golem_users) suit_store = /obj/item/gun/ballistic/revolver belt = /obj/item/storage/belt/sabre //ceremonial shamnk backpack_contents = list( - /obj/item/storage/box/syndie, /obj/item/modular_computer/tablet/preset/syndicate=1, /obj/item/ammo_box/a357=2, /obj/item/melee/classic_baton/telescopic=1 @@ -936,9 +909,7 @@ GLOBAL_LIST_EMPTY(servant_golem_users) l_pocket = /obj/item/flashlight r_pocket = /obj/item/kitchen/knife/combat/survival implants = list(/obj/item/implant/weapons_auth) - backpack_contents = list( - /obj/item/storage/box/syndie - ) + box = /obj/item/storage/box/survival/syndie /datum/outfit/syndicate_derelict_engi/post_equip(mob/living/carbon/human/H) H.faction |= ROLE_SYNDICATE diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 94ebc96c3bf2..1a7b15b63bb1 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -370,7 +370,7 @@ qdel(src) /obj/structure/girder/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 8) if(RCD_DECONSTRUCT) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 0313894e0e60..17757fdf3a85 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -28,7 +28,7 @@ /obj/structure/grille/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - var/ratio = obj_integrity / max_integrity + var/ratio = atom_integrity / max_integrity ratio = CEILING(ratio*4, 1) * 25 if(ratio>75) @@ -68,7 +68,7 @@ . += span_notice("The anchoring screws are unscrewed. The rods look like they could be cut through.") /obj/structure/grille/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) if(RCD_WINDOWGRILLE) @@ -158,6 +158,9 @@ . = . || (mover.pass_flags & PASSGRILLE) /obj/structure/grille/attackby(obj/item/W, mob/user, params) + var/obj/structure/window/window = locate() in loc + if(window && window.fulltile && window.anchored) + return TRUE // don't attack grilles through windows, that's weird and causes too many problems user.changeNext_move(CLICK_CD_MELEE) add_fingerprint(user) if(W.tool_behaviour == TOOL_WIRECUTTER) @@ -245,7 +248,8 @@ transfer_fingerprints_to(R) ..() -/obj/structure/grille/obj_break() +/obj/structure/grille/atom_break() + . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) density = FALSE broken = TRUE @@ -304,9 +308,8 @@ return null /obj/structure/grille/broken // Pre-broken grilles for map placement - icon_state = "brokengrille" + icon_state = "grille_broken" density = FALSE - obj_integrity = 20 broken = TRUE rods_amount = 1 rods_broken = FALSE @@ -316,6 +319,7 @@ /obj/structure/grille/broken/Initialize(mapload) . = ..() holes = (holes | 16) + update_integrity(20) update_appearance() /obj/structure/grille/ratvar @@ -325,6 +329,12 @@ desc = "A strangely-shaped grille." broken_type = /obj/structure/grille/ratvar/broken + // These ones are too cool to smooth + base_icon_state = null + smoothing_flags = NONE + smoothing_groups = null + canSmoothWith = null + /obj/structure/grille/ratvar/Initialize(mapload) . = ..() if(broken) @@ -347,9 +357,12 @@ /obj/structure/grille/ratvar/broken icon_state = "brokenratvargrille" density = FALSE - obj_integrity = 20 broken = TRUE rods_amount = 1 rods_broken = FALSE grille_type = /obj/structure/grille/ratvar broken_type = null + +/obj/structure/grille/ratvar/broken/Initialize(mapload) + . = ..() + update_integrity(20) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 646e6717209b..ec4a22008de2 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -284,7 +284,7 @@ if(!shockcd) if(ismob(user)) var/mob/living/M = user - M.electrocute_act(15,"Energy Barrier", zone=user.held_index_to_body_zone(user.active_hand_index)) // you touched it with your hand + M.electrocute_act(15,"Energy Barrier", zone=user.held_index_to_hand(user.active_hand_index)) // you touched it with your hand shockcd = TRUE addtimer(CALLBACK(src, PROC_REF(cooldown)), 5) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 6ec31322253d..609f99101914 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -15,6 +15,9 @@ if(default_unfasten_wrench(user, I)) return else if(istype(I, /obj/item/stack/rods)) + if(!anchored) + to_chat(user, span_warning("[src] must be anchored first!")) + return var/obj/item/stack/rods/R = I if(R.get_amount() >= 4) R.use(4) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c270c1d47913..ca111ff4fecf 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -52,7 +52,7 @@ qdel(src) /obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_FLOORWALL) + if(the_rcd.construction_mode == RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2) /obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index efc741377471..88e51f98fcb7 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -126,7 +126,7 @@ var/plunge_mod = 1 //time*plunge_mod = total time we take to plunge an object var/reinforced = TRUE //whether we do heavy duty stuff like geysers / TG made all plungers reinforced -/obj/item/plunger/attack_obj(obj/O, mob/living/user) +/obj/item/plunger/attack_atom(obj/O, mob/living/user) if(!O.plunger_act(src, user, reinforced)) return ..() diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 842c2885ad12..0f3997c90fda 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -198,7 +198,7 @@ /obj/item/gun_control/CanItemAutoclick() return TRUE -/obj/item/gun_control/attack_obj(obj/O, mob/living/user) +/obj/item/gun_control/attack_atom(obj/O, mob/living/user) user.changeNext_move(CLICK_CD_MELEE) O.attacked_by(src, user) diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index cc189048636e..d2d42d7e2358 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -314,7 +314,7 @@ /obj/structure/mineral_door/paperframe/examine(mob/user) . = ..() - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) . += span_info("It looks a bit damaged, you may be able to fix it with some paper.") /obj/structure/mineral_door/paperframe/pickaxe_door(mob/living/user, obj/item/I) @@ -331,10 +331,10 @@ fire_act(I.is_hot()) return - if((user.a_intent != INTENT_HARM) && istype(I, /obj/item/paper) && (obj_integrity < max_integrity)) + if((user.a_intent != INTENT_HARM) && istype(I, /obj/item/paper) && (atom_integrity < max_integrity)) user.visible_message("[user] starts to patch the holes in [src].", span_notice("You start patching some of the holes in [src]!")) if(do_after(user, 2 SECONDS, src)) - obj_integrity = min(obj_integrity+4,max_integrity) + update_integrity(min(atom_integrity + 4, max_integrity)) qdel(I) user.visible_message("[user] patches some of the holes in [src].", span_notice("You patch some of the holes in [src]!")) return TRUE diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 7d22e05d02f5..dd80d3af2396 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -23,7 +23,7 @@ /obj/structure/mirror/Initialize(mapload) . = ..() if(icon_state == "mirror_broke" && !broken) - obj_break(null, mapload) + atom_break(null, mapload) /obj/structure/mirror/proc/get_choices(mob/living/carbon/human/H) . = list() @@ -78,6 +78,10 @@ if(broken || !Adjacent(user)) return + if(is_synth(user)) + to_chat(user, span_warning("You may not change your appearance.")) + return + if(user && ishuman(user)) var/mob/living/carbon/human/H = user var/choices = get_choices(H) // Get the choices you can change @@ -94,12 +98,8 @@ return . = apply_choices(selection, newstyle, H) // Now apply the style -/obj/structure/mirror/examine_status(mob/user) - if(broken) - return list()// no message spam - return ..() - -/obj/structure/mirror/obj_break(damage_flag, mapload) +/obj/structure/mirror/atom_break(damage_flag, mapload) + . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) icon_state = "mirror_broke" if(!mapload) @@ -144,7 +144,7 @@ /obj/item/wallframe/mirror name = "mirror" - desc = "a mirror on your hand, what are you gonna do?" + desc = "A mirror on your hand, what are you gonna do?" icon = 'icons/obj/watercloset.dmi' icon_state = "mirror" result_path = /obj/structure/mirror diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index f883633a0772..d367167c6537 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -252,6 +252,8 @@ GLOBAL_LIST_EMPTY(crematoriums) /obj/structure/bodycontainer/crematorium/proc/cremate(mob/user) if(locked) return //don't let you cremate something twice or w/e + if(is_synth(user)) + return // Make sure we don't delete the actual morgue and its tray var/list/conts = get_all_contents() - src - connected diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 5ae8c597fa3d..613b69665255 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -25,8 +25,7 @@ ADD_TRAIT(L, TRAIT_MUTE, STATUE_MUTE) L.faction += "mimic" //Stops mimics from instaqdeling people in statues L.status_flags |= GODMODE - obj_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues - max_integrity = obj_integrity + modify_max_integrity(L.health + 100, FALSE) //stoning damaged mobs will result in easier to shatter statues START_PROCESSING(SSobj, src) ..() @@ -65,7 +64,7 @@ petrified_mob.status_flags &= ~GODMODE petrified_mob.forceMove(loc) REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) - petrified_mob.take_overall_damage((petrified_mob.health - obj_integrity + 100)) //any new damage the statue incurred is transfered to the mob + petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transfered to the mob petrified_mob.faction -= "mimic" petrified_mob = null return ..() diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index ddc0983467cb..56135aa17f73 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -38,13 +38,13 @@ add_fingerprint(user) if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return to_chat(user, span_notice("You begin repairing [src]...")) if(I.use_tool(src, user, 40, volume=50)) - obj_integrity = max_integrity + update_integrity(max_integrity) to_chat(user, span_notice("You repair [src].")) else to_chat(user, span_warning("[src] is already in good condition!")) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 300bfa7449fa..57cf43679a69 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -98,7 +98,7 @@ new buildstacktype(drop_location(), buildstackamount) qdel(src) else if(W.tool_behaviour == TOOL_WELDER) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!W.tool_start_check(user, amount=0)) return @@ -106,7 +106,7 @@ span_notice("You begin repairing [src]..."), span_italics("You hear welding.")) if(W.use_tool(src, user, 40, volume=40)) - obj_integrity = max_integrity + update_integrity(max_integrity) user.visible_message("[user] has repaired [src].", \ span_notice("You finish repairing [src].")) diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 1c1bc933a2d3..0755465d4bbe 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -22,6 +22,11 @@ soundloop = new(list(src), FALSE) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/machinery/shower/Destroy() QDEL_NULL(soundloop) QDEL_NULL(reagents) @@ -95,8 +100,7 @@ qdel(mist) -/obj/machinery/shower/Crossed(atom/movable/AM) - ..() +/obj/machinery/shower/proc/on_entered(datum/source, atom/movable/AM, ...) if(on) wash_atom(AM) diff --git a/code/game/objects/structures/signs/signs_plaques.dm b/code/game/objects/structures/signs/signs_plaques.dm index 3220e0523054..216ba23cf52b 100644 --- a/code/game/objects/structures/signs/signs_plaques.dm +++ b/code/game/objects/structures/signs/signs_plaques.dm @@ -26,21 +26,6 @@ desc = "Next to the extremely long list of names and job titles, there is a drawing of a little child. The child appears to be retarded. Beneath the image, someone has scratched the word \"PACKETS\"." icon_state = "kiddieplaque" -/obj/structure/sign/plaques/ai_password - name = "\improper AI default password" - desc = "This plaque contains the default password for AI control consoles onboard this station." - var/control_code = "BUG" - -/obj/structure/sign/plaques/ai_password/Initialize(mapload) - . = ..() - control_code = GLOB.ai_control_code - -/obj/structure/sign/plaques/ai_password/examine(mob/living/user) - . = ..() - if(Adjacent(user)) - . += span_notice("The following digits are stamped into the plaque: [control_code]") - else - . += span_notice("You must be closer to read the code.") /obj/structure/sign/plaques/kiddie/badger name = "\improper Remembrance Plaque" diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index c2fa6dcc5c3c..851a5b956adb 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -10,6 +10,7 @@ name = "stairs" icon = 'icons/obj/stairs.dmi' icon_state = "stairs" + layer = BELOW_OPEN_DOOR_LAYER anchored = TRUE move_resist = INFINITY diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index f35d78f5b09a..4550aedf592c 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -315,13 +315,13 @@ icon_state = "cheesus1" /obj/structure/statue/cheese/cheesus/attackby(obj/item/W, mob/user, params) - if(obj_integrity <= 20) + if(atom_integrity <= 20) icon_state = "cheesus4" return ..() - if(obj_integrity <= 40) + if(atom_integrity <= 40) icon_state = "cheesus3" return ..() - if(obj_integrity <= 60) + if(atom_integrity <= 60) icon_state = "cheesus2" return ..() return ..() @@ -343,9 +343,8 @@ /obj/structure/statue/elder_atmosian name = "Elder Atmosian" - desc = "A statue of an Elder Atmosian, capable of bending the laws of thermodynamics to their will." + desc = "A statue of Colton Oppenheimer, an Elder Atmosian who was capable of bending the laws of thermodynamics to his will." icon_state = "atmos" custom_materials = list(/datum/material/metalhydrogen = MINERAL_MATERIAL_AMOUNT*10, /datum/material/zaukerite = MINERAL_MATERIAL_AMOUNT*15) max_integrity = 1000 - obj_integrity = 1000 impressiveness = 100 diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 4a5968090268..2d4451b3db59 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -189,14 +189,14 @@ /obj/structure/table/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/rsf)) // Stops RSF from placing itself instead of glasses return - if(!(flags_1 & NODECONSTRUCT_1)) - if(I.tool_behaviour == TOOL_SCREWDRIVER && deconstruction_ready && (user.a_intent != INTENT_HELP && user.a_intent != INTENT_HARM || !(INTENT_DISARM in user.possible_a_intents))) + if(!(flags_1 & NODECONSTRUCT_1) && deconstruction_ready && ((user.a_intent != INTENT_HELP || HAS_TRAIT(I, TRAIT_NODROP)) && (user.a_intent != INTENT_HARM || (I.item_flags & NOBLUDGEON)) || !(INTENT_DISARM in user.possible_a_intents))) + if(I.tool_behaviour == TOOL_SCREWDRIVER) to_chat(user, span_notice("You start disassembling [src]...")) if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE) return - if(I.tool_behaviour == TOOL_WRENCH && deconstruction_ready && (user.a_intent != INTENT_HELP && user.a_intent != INTENT_HARM || !(INTENT_DISARM in user.possible_a_intents))) + if(I.tool_behaviour == TOOL_WRENCH) to_chat(user, span_notice("You start deconstructing [src]...")) if(I.use_tool(src, user, 40, volume=50)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) @@ -211,7 +211,7 @@ return // If the tray IS empty, continue on (tray will be placed on the table like other items) - if(user.a_intent != INTENT_HARM && !(I.item_flags & ABSTRACT)) + if((user.a_intent != INTENT_HARM && !HAS_TRAIT(I, TRAIT_NODROP)) && !(I.item_flags & ABSTRACT)) // if you can't drop it, you can't place it on the table if(user.transferItemToLoc(I, drop_location())) var/list/click_params = params2list(params) //Center the icon where the user clicked. @@ -236,7 +236,7 @@ qdel(src) /obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 24, "cost" = 16) return FALSE @@ -270,13 +270,16 @@ . = ..() debris += new frame debris += new /obj/item/shard + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/structure/table/glass/Destroy() QDEL_LIST(debris) . = ..() -/obj/structure/table/glass/Crossed(atom/movable/AM) - . = ..() +/obj/structure/table/glass/proc/on_entered(datum/source, atom/movable/AM, ...) if(flags_1 & NODECONSTRUCT_1) return if(!isliving(AM)) @@ -512,7 +515,7 @@ addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 0.8 SECONDS) /obj/structure/table/reinforced/brass/ratvar_act() - obj_integrity = max_integrity + update_integrity(max_integrity) /obj/structure/table/bronze name = "bronze table" diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 9bc5785e2a85..3c7487decdb6 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -27,6 +27,12 @@ /obj/effect, /mob/dead)) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + COMSIG_ATOM_ENTERED = PROC_REF(on_trap_entered) + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/structure/trap/Destroy() qdel(spark_system) spark_system = null @@ -56,8 +62,7 @@ else animate(src, alpha = initial(alpha), time = time_between_triggers) -/obj/structure/trap/Crossed(atom/movable/AM) - . = ..() +/obj/structure/trap/proc/on_trap_entered(datum/source, atom/movable/AM, ...) if(last_trigger + time_between_triggers > world.time) return // Don't want the traps triggered by sparks, ghosts or projectiles. diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 205d357bee58..db680bc93572 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -24,8 +24,10 @@ var/glass_type = /obj/item/stack/sheet/glass var/glass_amount = 1 var/real_explosion_block //ignore this, just use explosion_block - var/breaksound = "shatter" - var/hitsound = 'sound/effects/Glasshit.ogg' + var/break_sound = SFX_SHATTER + var/knock_sound = 'sound/effects/glassknock.ogg' + var/bash_sound = 'sound/effects/glassbash.ogg' + var/hit_sound = 'sound/effects/glasshit.ogg' /// If some inconsiderate jerk has had their blood spilled on this window, thus making it cleanable var/bloodied = FALSE @@ -74,7 +76,7 @@ AddElement(/datum/element/connect_loc, loc_connections) /obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) return FALSE @@ -83,7 +85,7 @@ if (resistance_flags & INDESTRUCTIBLE) return FALSE - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_DECONSTRUCT) to_chat(user, span_notice("You deconstruct the window.")) qdel(src) @@ -163,7 +165,7 @@ user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_notice("Something knocks on [src].")) add_fingerprint(user) - playsound(src, 'sound/effects/Glassknock.ogg', 50, 1) + playsound(src, knock_sound, 50, TRUE) /obj/structure/window/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(!can_be_reached(user)) @@ -177,9 +179,15 @@ if(!can_be_reached(user)) return user.changeNext_move(CLICK_CD_MELEE) - user.visible_message("[user] knocks on [src].") - add_fingerprint(user) - playsound(src, 'sound/effects/Glassknock.ogg', 50, 1) + + if(user.a_intent != INTENT_HARM) + user.visible_message(span_notice("[user] knocks on [src]."), \ + span_notice("You knock on [src].")) + playsound(src, knock_sound, 50, TRUE) + else + user.visible_message(span_warning("[user] bashes [src]!"), \ + span_warning("You bash [src]!")) + playsound(src, bash_sound, 100, TRUE) /obj/structure/window/attack_paw(mob/user) return attack_hand(user) @@ -196,13 +204,13 @@ add_fingerprint(user) if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) if(!I.tool_start_check(user, amount=0)) return to_chat(user, span_notice("You begin repairing [src]...")) if(I.use_tool(src, user, 40, volume=50)) - obj_integrity = max_integrity + update_integrity(max_integrity) update_nearby_icons() to_chat(user, span_notice("You repair [src].")) else @@ -254,10 +262,10 @@ /obj/structure/window/proc/check_state_and_anchored(checked_state, checked_anchored) return check_state(checked_state) && check_anchored(checked_anchored) -/obj/structure/window/mech_melee_attack(obj/mecha/M, equip_allowed) +/obj/structure/window/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) if(!can_be_reached()) return - ..() + return ..() /obj/structure/window/proc/can_be_reached(mob/user) if(!fulltile) @@ -276,7 +284,7 @@ switch(damage_type) if(BRUTE) if(damage_amount) - playsound(src, hitsound, 75, 1) + playsound(src, hit_sound, 75, 1) else playsound(src, 'sound/weapons/tap.ogg', 50, 1) if(BURN) @@ -287,7 +295,7 @@ if(QDELETED(src)) return if(!disassembled) - playsound(src, breaksound, 70, 1) + playsound(src, break_sound, 70, 1) if(!(flags_1 & NODECONSTRUCT_1)) for(var/obj/item/shard/debris in spawnDebris(drop_location())) transfer_fingerprints_to(debris) // transfer fingerprints to shards only @@ -359,7 +367,7 @@ if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) QUEUE_SMOOTH(src) - var/ratio = obj_integrity / max_integrity + var/ratio = atom_integrity / max_integrity ratio = CEILING(ratio*4, 1) * 25 if(ratio > 75) return @@ -640,7 +648,7 @@ name = "frosted window" icon_state = "fwindow" -/* Full Tile Windows (more obj_integrity) */ +/* Full Tile Windows (more atom_integrity) */ /obj/structure/window/fulltile icon = 'icons/obj/smooth_structures/window.dmi' @@ -841,7 +849,7 @@ /obj/structure/window/reinforced/clockwork/ratvar_act() if(GLOB.ratvar_awakens) - obj_integrity = max_integrity + update_integrity(max_integrity) update_appearance() /obj/structure/window/reinforced/clockwork/narsie_act() @@ -886,8 +894,8 @@ name = "paper frame" desc = "A fragile separator made of thin wood and paper." icon = 'icons/obj/smooth_structures/paperframes.dmi' - icon_state = "frame-0" - base_icon_state = "frame" + icon_state = "paperframes-0" + base_icon_state = "paperframes" dir = FULLTILE_WINDOW_DIR opacity = TRUE max_integrity = 15 @@ -903,10 +911,12 @@ can_atmos_pass = 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) - breaksound = 'sound/items/poster_ripped.ogg' - hitsound = 'sound/weapons/slashmiss.ogg' - var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) - var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = ABOVE_OBJ_LAYER - 0.1) + knock_sound = SFX_PAGE_TURN + bash_sound = 'sound/weapons/slashmiss.ogg' + break_sound = 'sound/items/poster_ripped.ogg' + hit_sound = 'sound/weapons/slashmiss.ogg' + var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/structure_variations.dmi',icon_state = "paper-torn", layer = ABOVE_OBJ_LAYER - 0.1) + var/static/mutable_appearance/paper = mutable_appearance('icons/obj/smooth_structures/structure_variations.dmi',icon_state = "paper-whole", layer = ABOVE_OBJ_LAYER - 0.1) /obj/structure/window/paperframe/Initialize(mapload) . = ..() @@ -914,7 +924,7 @@ /obj/structure/window/paperframe/examine(mob/user) . = ..() - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) . += span_info("It looks a bit damaged, you may be able to fix it with some paper.") /obj/structure/window/paperframe/spawnDebris(location) @@ -927,20 +937,15 @@ if(.) return add_fingerprint(user) - if(user.a_intent != INTENT_HARM) - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message("[user] knocks on [src].") - playsound(src, "pageturn", 50, 1) - else + if(user.a_intent == INTENT_HARM) take_damage(4,BRUTE,MELEE, 0) - playsound(src, hitsound, 50, 1) if(!QDELETED(src)) user.visible_message(span_danger("[user] tears a hole in [src].")) - update_appearance(UPDATE_ICON) + update_appearance() /obj/structure/window/paperframe/update_appearance(updates) . = ..() - set_opacity(obj_integrity >= max_integrity) + set_opacity(atom_integrity >= max_integrity) /obj/structure/window/paperframe/update_icon(updates=ALL) . = ..() @@ -949,7 +954,7 @@ /obj/structure/window/paperframe/update_overlays() . = ..() - . += (obj_integrity < max_integrity) ? torn : paper + . += (atom_integrity < max_integrity) ? torn : paper /obj/structure/window/paperframe/attackby(obj/item/W, mob/user) if(W.is_hot()) @@ -957,22 +962,18 @@ return if(user.a_intent == INTENT_HARM) return ..() - if(istype(W, /obj/item/paper) && obj_integrity < max_integrity) + if(istype(W, /obj/item/paper) && atom_integrity < max_integrity) user.visible_message("[user] starts to patch the holes in \the [src].") if(do_after(user, 2 SECONDS, src)) - obj_integrity = min(obj_integrity+4,max_integrity) + update_integrity(min(atom_integrity + 4, max_integrity)) qdel(W) user.visible_message("[user] patches some of the holes in \the [src].") - if(obj_integrity == max_integrity) - update_appearance(UPDATE_ICON) + if(atom_integrity == max_integrity) + update_appearance() return ..() update_appearance() - - - - /obj/structure/cloth_curtain name = "curtain" desc = "Beta brand soft sheets" diff --git a/code/game/objects/structures/wire_splicing.dm b/code/game/objects/structures/wire_splicing.dm index ea9e8780fb4e..9fd8855d3e55 100644 --- a/code/game/objects/structures/wire_splicing.dm +++ b/code/game/objects/structures/wire_splicing.dm @@ -13,6 +13,10 @@ . = ..() messiness = rand (1,10) icon_state = "wire_splicing[messiness]" + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) //At messiness of 2 or below, triggering when walking on a catwalk is impossible @@ -77,8 +81,7 @@ . += span_warning("or you could add more wires..!") . += "It has [messiness] wire[messiness > 1?"s":""] dangling around." -/obj/structure/wire_splicing/Crossed(AM as mob|obj) - . = ..() +/obj/structure/wire_splicing/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM)) var/mob/living/L = AM //var/turf/T = get_turf(src) diff --git a/code/game/sound.dm b/code/game/sound.dm index 7d6f0a7691ad..812bf360847f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -62,20 +62,36 @@ falloff_distance - Distance at which falloff begins. Sound is at peak volume (in // Looping through the player list has the added bonus of working for mobs inside containers var/sound/S = sound(get_sfx(soundin)) - var/maxdistance = (SOUND_RANGE + extrarange) - var/z = turf_source.z - var/list/listeners = SSmobs.clients_by_zlevel[z] - if(!ignore_walls) //these sounds don't carry through walls - listeners = listeners & hearers(maxdistance,turf_source) - for(var/P in listeners) - var/mob/M = P - if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) - for(var/P in SSmobs.dead_players_by_zlevel[z]) - var/mob/M = P - if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) + var/maxdistance = SOUND_RANGE + extrarange + var/source_z = turf_source.z + var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() + . = list() //output everything that successfully heard the sound + + var/turf/above_turf = GET_TURF_ABOVE(turf_source) + var/turf/below_turf = GET_TURF_BELOW(turf_source) + + if(ignore_walls) + + if(above_turf && istransparentturf(above_turf)) + listeners += SSmobs.clients_by_zlevel[above_turf.z] + + if(below_turf && istransparentturf(turf_source)) + listeners += SSmobs.clients_by_zlevel[below_turf.z] + + else //these sounds don't carry through walls + listeners = get_hearers_in_view(maxdistance, turf_source) + + if(above_turf && istransparentturf(above_turf)) + listeners += get_hearers_in_view(maxdistance, above_turf) + + if(below_turf && istransparentturf(turf_source)) + listeners += get_hearers_in_view(maxdistance, below_turf) + + for(var/mob/listening_mob in listeners | SSmobs.dead_players_by_zlevel[source_z])//observers always hear through walls + if(get_dist(listening_mob, turf_source) <= maxdistance) + listening_mob.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) + . += listening_mob /*! playsound playsound_local is a proc used to play a sound directly on a mob from a specific turf. diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index e3ee7484de90..6edec65e9c25 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -165,6 +165,7 @@ desc = "A wall with a bamboo finish." icon = 'icons/turf/walls/bamboo_wall.dmi' icon_state = "wall-0" + base_icon_state = "bamboo_wall" sheet_type = /obj/item/stack/sheet/mineral/bamboo hardness = 60 smoothing_flags = SMOOTH_BITMASK diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index f5c71a3f3406..3b0bbe08903b 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -114,8 +114,8 @@ user.adjustFireLoss(5) playsound(src, 'sound/machines/fryer/deep_fryer_emerge.ogg', 50, TRUE) -/turf/closed/wall/clockwork/mech_melee_attack(obj/mecha/M, equip_allowed) - ..() +/turf/closed/wall/clockwork/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) + . = ..() if(heated) to_chat(M.occupant, span_userdanger("The wall's intense heat completely reflects your [M.name]'s attack!")) M.take_damage(20, BURN) diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index e7e417ba8d39..330a21dd0b8a 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -13,6 +13,10 @@ sheet_amount = 1 girder_type = /obj/structure/girder/reinforced explosion_block = 2 + max_integrity = 400 + damage_deflection = 75 // can't be damaged with most conventional weapons or tools + armor = list(MELEE = 80, BULLET = 80, LASER = 60, ENERGY = 25, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) + smash_flags = ENVIRONMENT_SMASH_RWALLS // rwalls only rad_insulation = RAD_FULL_INSULATION ///Dismantled state, related to deconstruction. var/d_state = INTACT @@ -40,19 +44,6 @@ new sheet_type(src, sheet_amount) new /obj/item/stack/sheet/metal(src, 2) -/turf/closed/wall/r_wall/attack_animal(mob/living/simple_animal/M) - M.changeNext_move(CLICK_CD_MELEE) - M.do_attack_animation(src) - if(!M.environment_smash) - return - if(M.environment_smash & ENVIRONMENT_SMASH_RWALLS) - dismantle_wall(1) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) - else - playsound(src, 'sound/effects/bang.ogg', 50, 1) - to_chat(M, span_warning("This wall is far too strong for you to destroy.")) - - /turf/closed/wall/r_wall/try_decon(obj/item/W, mob/user, turf/T) //DECONSTRUCTION switch(d_state) diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index d5460156c700..7746641dabb6 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -7,6 +7,11 @@ icon_state = "wall-0" base_icon_state = "wall" explosion_block = 1 + max_integrity = 300 + damage_deflection = 20 // big chunk of solid metal + uses_integrity = TRUE + + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 50) // very tough thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall @@ -29,6 +34,7 @@ var/sheet_type = /obj/item/stack/sheet/metal var/sheet_amount = 2 var/girder_type = /obj/structure/girder + var/smash_flags = ENVIRONMENT_SMASH_WALLS|ENVIRONMENT_SMASH_RWALLS /// A turf that will replace this turf when this turf is destroyed var/decon_type @@ -59,6 +65,21 @@ . += ..() . += deconstruction_hints(user) +/turf/closed/wall/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) + . = ..() + if(.) // add a dent if it took damage + add_dent(WALL_DENT_HIT) + +/turf/closed/wall/run_atom_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration) + if(damage_amount < damage_deflection && (damage_type in list(MELEE, BULLET, LASER, ENERGY))) + return 0 // absolutely no bypassing damage deflection by using projectiles + return ..() + +/turf/closed/wall/atom_destruction(damage_flag) + if(damage_flag == MELEE) + playsound(src, 'sound/effects/meteorimpact.ogg', 50, TRUE) //Otherwise there's no sound for hitting the wall, since it's just dismantled + dismantle_wall(TRUE, (damage_flag==BOMB)) + /turf/closed/wall/proc/deconstruction_hints(mob/user) return span_notice("The outer plating is welded firmly in place.") @@ -106,22 +127,18 @@ /turf/closed/wall/ex_act(severity, target) if(target == src) - dismantle_wall(1,1) + dismantle_wall(TRUE, TRUE) return switch(severity) - if(1) + if(EXPLODE_DEVASTATE) //SN src = null var/turf/NT = ScrapeAway() NT.contents_explosion(severity, target) return - if(2) - if (prob(50)) - dismantle_wall(0,1) - else - dismantle_wall(1,1) - if(3) - if (prob(hardness)) - dismantle_wall(0,1) + if(EXPLODE_HEAVY) + dismantle_wall(pick(FALSE, TRUE), TRUE) + if(EXPLODE_LIGHT) + take_damage(150, BRUTE, BOMB) // less kaboom if(!density) ..() @@ -129,31 +146,11 @@ /turf/closed/wall/blob_act(obj/structure/blob/B) - if(prob(50)) - dismantle_wall() - else - add_dent(WALL_DENT_HIT) + take_damage(400, BRUTE, MELEE, FALSE) + playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) -/turf/closed/wall/mech_melee_attack(obj/mecha/M, equip_allowed) - M.do_attack_animation(src) - switch(M.damtype) - if(BRUTE) - if(M.meleesound) - playsound(src, 'sound/weapons/punch4.ogg', 50, 1) - visible_message(span_danger("[M.name] has hit [src]!"), null, null, COMBAT_MESSAGE_RANGE) - if(prob(hardness + M.force) && M.force > 20) - dismantle_wall(1) - if(M.meleesound) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) - else - add_dent(WALL_DENT_HIT) - if(BURN) - if(M.meleesound) - playsound(src, 'sound/items/welder.ogg', 100, 1) - if(TOX) - if(M.meleesound) - playsound(src, 'sound/effects/spray2.ogg', 100, 1) - return FALSE +/turf/closed/wall/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) + return ..(M, punch_force * 5, equip_allowed) /turf/closed/wall/attack_paw(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) @@ -163,21 +160,19 @@ /turf/closed/wall/attack_animal(mob/living/simple_animal/M) M.changeNext_move(CLICK_CD_MELEE) M.do_attack_animation(src) - if((M.environment_smash & ENVIRONMENT_SMASH_WALLS) || (M.environment_smash & ENVIRONMENT_SMASH_RWALLS)) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) - dismantle_wall(1) + if(!(M.environment_smash & smash_flags)) + playsound(src, 'sound/effects/bang.ogg', 50, 1) + to_chat(M, span_warning("This wall is far too strong for you to destroy.")) return + take_damage(400, BRUTE, MELEE, FALSE) + playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) /turf/closed/wall/attack_hulk(mob/user, does_attack_animation = 0) ..(user, 1) - if(prob(hardness)) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) - user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") - dismantle_wall(1) - else - playsound(src, 'sound/effects/bang.ogg', 50, 1) - add_dent(WALL_DENT_HIT) - to_chat(user, span_notice("You punch the wall.")) + user.say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ), forced = "hulk") + take_damage(400, BRUTE, MELEE, FALSE) + playsound(src, 'sound/effects/bang.ogg', 50, 1) + to_chat(user, span_notice("You punch the wall.")) return TRUE /turf/closed/wall/attack_hand(mob/user) @@ -189,14 +184,14 @@ playsound(src, 'sound/weapons/genhit.ogg', 25, 1) add_fingerprint(user) -/turf/closed/wall/attackby(obj/item/W, mob/user, params) +/turf/closed/wall/attackby(obj/item/attacking_item, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) if (!user.IsAdvancedToolUser()) to_chat(user, span_warning("You don't have the dexterity to do this!")) return //get the user's location - if(!isturf(user.loc)) + if(!isturf(user.loc) && !ismecha(user.loc)) return //can't do this stuff whilst inside objects and such add_fingerprint(user) @@ -204,30 +199,32 @@ var/turf/T = user.loc //get user's location for delay checks //the istype cascade has been spread among various procs for easy overriding - if(try_clean(W, user, T) || try_wallmount(W, user, T) || try_decon(W, user, T)) + if(try_clean(attacking_item, user, T) || try_wallmount(attacking_item, user, T) || try_decon(attacking_item, user, T)) return - . = ..() - - if(!.) - to_chat(user, span_notice("You hit the wall with \the [W] but nothing happens!")) - playsound(src, 'sound/weapons/genhit.ogg', 25, 1) + return ..() || (attacking_item.attack_atom(src, user)) /turf/closed/wall/proc/try_clean(obj/item/W, mob/user, turf/T) - if((user.a_intent != INTENT_HELP) || !LAZYLEN(dent_decals)) + if(user.a_intent == INTENT_HARM) return FALSE if(W.tool_behaviour == TOOL_WELDER) + if(atom_integrity >= max_integrity) + to_chat(user, span_warning("[src] is intact!")) + return TRUE + if(!W.tool_start_check(user, amount=0)) - return FALSE + to_chat(user, span_warning("You need more fuel to repair [src]!")) + return TRUE - to_chat(user, span_notice("You begin fixing dents on the wall...")) - if(W.use_tool(src, user, 0, volume=100)) - if(iswallturf(src) && LAZYLEN(dent_decals)) - to_chat(user, span_notice("You fix some dents on the wall.")) - cut_overlay(dent_decals) - dent_decals.Cut() + to_chat(user, span_notice("You begin repairing [src]...")) + if(W.use_tool(src, user, 3 SECONDS, volume=100)) + update_integrity(max_integrity) + to_chat(user, span_notice("You repair [src].")) + cut_overlay(dent_decals) + dent_decals.Cut() return TRUE + return TRUE return FALSE @@ -263,14 +260,11 @@ return FALSE /turf/closed/wall/singularity_pull(S, current_size) - ..() + . = ..() if(current_size >= STAGE_FIVE) - if(prob(50)) - dismantle_wall() - return - if(current_size == STAGE_FOUR) - if(prob(30)) - dismantle_wall() + take_damage(250, armour_penetration=100) // LORD SINGULOTH CARES NOT FOR YOUR "ARMOR" + else if(current_size == STAGE_FOUR) + take_damage(150, armour_penetration=100) /turf/closed/wall/narsie_act(force, ignore_mobs, probability = 20) . = ..() @@ -297,7 +291,7 @@ dismantle_wall(1) /turf/closed/wall/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 40, "cost" = 26) return FALSE @@ -310,7 +304,10 @@ return TRUE return FALSE -/turf/closed/wall/proc/add_dent(denttype, x=rand(-8, 8), y=rand(-8, 8)) +/turf/proc/add_dent(denttype, x=rand(-8, 8), y=rand(-8, 8)) // this only exists because turf code is terrible + return + +/turf/closed/wall/add_dent(denttype, x=rand(-8, 8), y=rand(-8, 8)) if(LAZYLEN(dent_decals) >= MAX_DENT_DECALS) return diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 6994d4df97ad..4c71d6b75602 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -170,6 +170,7 @@ desc = "Soft velvet carpeting. Feels good between your toes." icon = 'icons/turf/floors/carpet.dmi' icon_state = "carpet-255" + base_icon_state = "carpet" flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_CARPET @@ -184,54 +185,63 @@ /turf/open/indestructible/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' icon_state = "carpet_black-255" + base_icon_state = "carpet_black" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLACK canSmoothWith = SMOOTH_GROUP_CARPET_BLACK /turf/open/indestructible/carpet/blue icon = 'icons/turf/floors/carpet_blue.dmi' icon_state = "carpet_blue-255" + base_icon_state = "carpet_blue" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE canSmoothWith = SMOOTH_GROUP_CARPET_BLUE /turf/open/indestructible/carpet/cyan icon = 'icons/turf/floors/carpet_cyan.dmi' icon_state = "carpet_cyan-255" + base_icon_state = "carpet_cyan" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_CYAN canSmoothWith = SMOOTH_GROUP_CARPET_CYAN /turf/open/indestructible/carpet/green icon = 'icons/turf/floors/carpet_green.dmi' icon_state = "carpet_green-255" + base_icon_state = "carpet_green" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN canSmoothWith = SMOOTH_GROUP_CARPET_GREEN /turf/open/indestructible/carpet/orange icon = 'icons/turf/floors/carpet_orange.dmi' icon_state = "carpet_orange-255" + base_icon_state = "carpet_orange" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ORANGE canSmoothWith = SMOOTH_GROUP_CARPET_ORANGE /turf/open/indestructible/carpet/purple icon = 'icons/turf/floors/carpet_purple.dmi' icon_state = "carpet_purple-255" + base_icon_state = "carpet_purple" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE /turf/open/indestructible/carpet/red icon = 'icons/turf/floors/carpet_red.dmi' icon_state = "carpet_red-255" + base_icon_state = "carpet_red" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_RED canSmoothWith = SMOOTH_GROUP_CARPET_RED /turf/open/indestructible/carpet/royalblack icon = 'icons/turf/floors/carpet_royalblack.dmi' icon_state = "carpet_royalblack-255" + base_icon_state = "carpet_royalblack" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK /turf/open/indestructible/carpet/royalblue icon = 'icons/turf/floors/carpet_royalblue.dmi' icon_state = "carpet_royalblue-255" + base_icon_state = "carpet_royalblue" smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLUE canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLUE diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 917795eb70bd..e4637556e85d 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -16,6 +16,10 @@ . = ..() apply_components(mapload) +/// Handles adding the chasm component to the turf (So stuff falls into it!) +/turf/open/chasm/proc/apply_components(mapload) + AddComponent(/datum/component/chasm, GET_TURF_BELOW(src), mapload) + /// Lets people walk into chasms. /turf/open/chasm/CanAllowThrough(atom/movable/mover, border_dir) . = ..() @@ -36,7 +40,7 @@ return /turf/open/chasm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) return FALSE @@ -128,12 +132,5 @@ light_power = 0.65 can_atmos_pass = ATMOS_PASS_NO -/turf/open/chasm/magic/Initialize(mapload) - . = ..() - var/turf/T = pick(get_area_turfs(/area/centcom/fabric_of_reality)) - if(T) - set_target(T) - -/// Handles adding the chasm component to the turf (So stuff falls into it!) -/turf/open/chasm/proc/apply_components(mapload) - AddComponent(/datum/component/chasm, null, mapload) +/turf/open/chasm/magic/apply_components(mapload) + AddComponent(/datum/component/chasm, pick(get_area_turfs(/area/centcom/fabric_of_reality)), mapload) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 80706649c786..213bdebcb489 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -28,38 +28,7 @@ var/floor_tile = null //tile that this floor drops /turf/open/floor/Initialize(mapload) - - // if (!broken_states) - // broken_states = typelist("broken_states", list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")) - // else - // broken_states = typelist("broken_states", broken_states) - // burnt_states = typelist("burnt_states", burnt_states) - // if(!broken && broken_states && (icon_state in broken_states)) - // broken = TRUE - // if(!burnt && burnt_states && (icon_state in burnt_states)) - // burnt = TRUE . = ..() - //This is so damaged or burnt tiles or platings don't get remembered as the default tile - // var/static/list/icons_to_ignore_at_floor_init = list("foam_plating", "plating","light_on","light_on_flicker1","light_on_flicker2", - // "light_on_clicker3","light_on_clicker4","light_on_clicker5", - // "light_on_broken","light_off","wall_thermite","grass", "sand", - // "asteroid","asteroid_dug", - // "asteroid0","asteroid1","asteroid2","asteroid3","asteroid4", - // "asteroid5","asteroid6","asteroid7","asteroid8","asteroid9","asteroid10","asteroid11","asteroid12", - // "basalt","basalt_dug", - // "basalt0","basalt1","basalt2","basalt3","basalt4", - // "basalt5","basalt6","basalt7","basalt8","basalt9","basalt10","basalt11","basalt12", - // "oldburning","light-on-r","light-on-y","light-on-g","light-on-b", "wood", "carpetsymbol", "carpetstar", - // "carpetcorner", "carpetside", "carpet", "ironsand1", "ironsand2", "ironsand3", "ironsand4", "ironsand5", - // "ironsand6", "ironsand7", "ironsand8", "ironsand9", "ironsand10", "ironsand11", - // "ironsand12", "ironsand13", "ironsand14", "ironsand15", "bamboo", "bamboosymbol", "bamboostar") - // if(broken || burnt || (icon_state in icons_to_ignore_at_floor_init)) //so damaged/burned tiles or plating icons aren't saved as the default - // icon_state_regular_floor = "floor" - // icon_regular_floor = 'icons/turf/floors.dmi' - // else - // icon_state_regular_floor = icon_state - // icon_regular_floor = icon - if(mapload && prob(33)) MakeDirty() if(is_station_level(z)) @@ -136,7 +105,7 @@ return T.break_tile() -/turf/open/floor/proc/make_plating() +/turf/open/floor/proc/make_plating(force = FALSE) return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/ChangeTurf(path, new_baseturf, flags) @@ -164,8 +133,8 @@ return FALSE /turf/open/floor/crowbar_act(mob/living/user, obj/item/I) - if(istype(I,/obj/item/jawsoflife/jimmy)) - to_chat(user,"The [I] cannot pry tiles.") + if(istype(I, /obj/item/jawsoflife/jimmy) || istype(I, /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp)) + to_chat(user,"[I] cannot pry tiles.") return if(overfloor_placed && pry_tile(I, user)) return TRUE @@ -185,7 +154,7 @@ I.play_tool_sound(src, 80) return remove_tile(user, silent) -/turf/open/floor/proc/remove_tile(mob/user, silent = FALSE, make_tile = TRUE) +/turf/open/floor/proc/remove_tile(mob/user, silent = FALSE, make_tile = TRUE, force_plating) if(broken || burnt) broken = 0 burnt = 0 @@ -194,29 +163,34 @@ else if(user && !silent) to_chat(user, span_notice("You remove the floor tile.")) - if(floor_tile && make_tile) - new floor_tile(src) - return make_plating() + if(make_tile) + spawn_tile() + return make_plating(force_plating) + +/turf/open/floor/proc/has_tile() + return floor_tile + +/turf/open/floor/proc/spawn_tile() + if(!has_tile()) + return null + return new floor_tile(src) /turf/open/floor/singularity_pull(S, current_size) ..() - if(current_size == STAGE_THREE) - if(prob(30)) - if(floor_tile) - new floor_tile(src) - make_plating() - else if(current_size == STAGE_FOUR) - if(prob(50)) - if(floor_tile) - new floor_tile(src) - make_plating() - else if(current_size >= STAGE_FIVE) - if(floor_tile) + var/sheer = FALSE + switch(current_size) + if(STAGE_THREE) + if(prob(30)) + sheer = TRUE + if(STAGE_FOUR) + if(prob(50)) + sheer = TRUE + if(STAGE_FIVE to INFINITY) if(prob(70)) - new floor_tile(src) - make_plating() - else if(prob(50)) - attempt_lattice_replacement() + sheer = TRUE + if(sheer) + if(has_tile()) + remove_tile(null, TRUE, TRUE, TRUE) /turf/open/floor/narsie_act(force, ignore_mobs, probability = 20) . = ..() @@ -235,7 +209,7 @@ ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 16) if(RCD_AIRLOCK) @@ -253,6 +227,10 @@ return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) if(RCD_FURNISHING) return list("mode" = RCD_FURNISHING, "delay" = the_rcd.furnish_delay, "cost" = the_rcd.furnish_cost) + if(RCD_CONVEYOR) + return list("mode" = RCD_CONVEYOR, "delay" = 5, "cost" = 5) + if(RCD_SWITCH) + return list("mode" = RCD_SWITCH, "delay" = 1, "cost" = 1) return FALSE /turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -329,4 +307,19 @@ var/atom/new_furnish = new the_rcd.furnish_type(src) new_furnish.setDir(user.dir) return TRUE + if(RCD_CONVEYOR) + if(locate(/obj/machinery/conveyor) in src) + return FALSE + if(get_turf(user) == src) + return FALSE + var/obj/machinery/conveyor/new_conveyor = new /obj/machinery/conveyor(src) + new_conveyor.setDir(user.dir) + if(the_rcd.linked_switch_id) + new_conveyor.id = the_rcd.linked_switch_id // link the conveyor if possible + return TRUE + if(RCD_SWITCH) + if(locate(/obj/machinery/conveyor_switch) in src) + return FALSE + new /obj/machinery/conveyor_switch(src) + return TRUE return FALSE diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index b09a66f88395..2f1d2f7a5548 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -48,22 +48,21 @@ C.play_tool_sound(src, 80) return remove_tile(user, silent, (C.tool_behaviour == TOOL_SCREWDRIVER)) -/turf/open/floor/wood/remove_tile(mob/user, silent = FALSE, make_tile = TRUE) +/turf/open/floor/wood/remove_tile(mob/user, silent = FALSE, make_tile = TRUE, force_plating) if(broken || burnt) - broken = 0 - burnt = 0 + broken = FALSE + burnt = FALSE if(user && !silent) to_chat(user, span_notice("You remove the broken planks.")) else if(make_tile) if(user && !silent) to_chat(user, span_notice("You unscrew the planks.")) - if(floor_tile) - new floor_tile(src) + spawn_tile() else if(user && !silent) to_chat(user, span_notice("You forcefully pry off the planks, destroying them in the process.")) - return make_plating() + return make_plating(force_plating) /turf/open/floor/wood/parquet icon_state = "wood-parquet" @@ -228,7 +227,8 @@ /turf/open/floor/bamboo desc = "A bamboo mat with a decorative trim." icon = 'icons/turf/floors/bamboo_mat.dmi' - icon_state = "bamboo" + icon_state = "mat-255" + base_icon_state = "mat" floor_tile = /obj/item/stack/tile/bamboo smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_BAMBOO_FLOOR diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 2c6a8bbd0005..115a9e89c71d 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -163,7 +163,7 @@ to_chat(user, span_danger("You hit [src], to no effect!")) /turf/open/floor/plating/foam/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - if(the_rcd.mode == RCD_FLOORWALL) + if(the_rcd.construction_mode == RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) /turf/open/floor/plating/foam/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index b0f441a1d59c..080c7dd51e82 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -69,10 +69,10 @@ /turf/open/floor/plating/asteroid/MakeDry() return -/turf/open/floor/plating/asteroid/attackby(obj/item/W, mob/user, params) +/turf/open/floor/plating/asteroid/attackby(obj/item/attacking_item, mob/user, params) . = ..() if(!.) - if(W.tool_behaviour == TOOL_SHOVEL || W.tool_behaviour == TOOL_MINING) + if(attacking_item.tool_behaviour == TOOL_SHOVEL || attacking_item.tool_behaviour == TOOL_MINING) if(!can_dig(user)) return TRUE @@ -81,16 +81,16 @@ to_chat(user, span_notice("You start digging...")) - if(W.use_tool(src, user, 40, volume=50)) + if(attacking_item.use_tool(src, user, 40, volume=50)) if(!can_dig(user)) return TRUE to_chat(user, span_notice("You dig a hole.")) getDug() - SSblackbox.record_feedback("tally", "pick_used_mining", 1, W.type) + SSblackbox.record_feedback("tally", "pick_used_mining", 1, attacking_item.type) return TRUE - else if(istype(W, /obj/item/storage/bag/ore)) + else if(istype(attacking_item, /obj/item/storage/bag/ore)) for(var/obj/item/stack/ore/O in src) - SEND_SIGNAL(W, COMSIG_PARENT_ATTACKBY, O) + attacking_item.attackby(O, user, params) /turf/open/floor/plating/asteroid/ex_act(severity, target) . = SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) diff --git a/code/game/turfs/open/floor/plating/catwalk_plating.dm b/code/game/turfs/open/floor/plating/catwalk_plating.dm new file mode 100644 index 000000000000..8f5ff3a1fa92 --- /dev/null +++ b/code/game/turfs/open/floor/plating/catwalk_plating.dm @@ -0,0 +1,103 @@ +/** + * ## catwalk flooring + * + * They show what's underneath their catwalk flooring (pipes and the like) + * you can screwdriver it to interact with the underneath stuff without destroying the tile... + * unless you want to! + */ +/turf/open/floor/catwalk_floor //the base type, meant to look like a maintenance panel + icon = 'icons/turf/floors/catwalk_plating.dmi' + icon_state = "maint_above" + name = "catwalk floor" + desc = "Flooring that shows its contents underneath. Engineers love it!" + baseturfs = /turf/open/floor/plating + floor_tile = /obj/item/stack/tile/catwalk_tile + layer = CATWALK_LAYER + plane = FLOOR_PLANE + footstep = FOOTSTEP_CATWALK + overfloor_placed = TRUE + underfloor_accessibility = UNDERFLOOR_VISIBLE + var/covered = TRUE + var/catwalk_type = "maint" + var/static/list/catwalk_underlays = list() + +/turf/open/floor/catwalk_floor/Initialize(mapload) + . = ..() + if(!catwalk_underlays[catwalk_type]) + var/mutable_appearance/plating_underlay = mutable_appearance(icon, "[catwalk_type]_below", TURF_LAYER) + catwalk_underlays[catwalk_type] = plating_underlay + underlays += catwalk_underlays[catwalk_type] + update_icon() + +/turf/open/floor/catwalk_floor/examine(mob/user) + . = ..() + + if(covered) + . += span_notice("You can unscrew it to reveal the contents beneath.") + else + . += span_notice("You can screw it to hide the contents beneath.") + . += span_notice("There's a small crack on the edge of it.") + +/turf/open/floor/catwalk_floor/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + covered = !covered + if(!covered) + underfloor_accessibility = UNDERFLOOR_INTERACTABLE + layer = TURF_LAYER + plane = FLOOR_PLANE + icon_state = "[catwalk_type]_below" + else + underfloor_accessibility = UNDERFLOOR_VISIBLE + layer = CATWALK_LAYER + plane = FLOOR_PLANE //for some reason these are black + icon_state = "[catwalk_type]_above" + user.balloon_alert(user, "[!covered ? "cover removed" : "cover added"]") + tool.play_tool_sound(src) + update_icon() + +/turf/open/floor/catwalk_floor/crowbar_act(mob/user, obj/item/crowbar) + if(covered) + user.balloon_alert(user, "remove cover first!") + return FALSE + . = ..() + +//Reskins! More fitting with most of our tiles, and appear as a radial on the base type +/turf/open/floor/catwalk_floor/iron + name = "iron plated catwalk floor" + icon_state = "iron_above" + floor_tile = /obj/item/stack/tile/catwalk_tile/iron + catwalk_type = "iron" + + +/turf/open/floor/catwalk_floor/iron_white + name = "white plated catwalk floor" + icon_state = "whiteiron_above" + floor_tile = /obj/item/stack/tile/catwalk_tile/iron_white + catwalk_type = "whiteiron" + +/turf/open/floor/catwalk_floor/iron_dark + name = "dark plated catwalk floor" + icon_state = "darkiron_above" + floor_tile = /obj/item/stack/tile/catwalk_tile/iron_dark + catwalk_type = "darkiron" + +/turf/open/floor/catwalk_floor/flat_white + name = "white large plated catwalk floor" + icon_state = "flatwhite_above" + floor_tile = /obj/item/stack/tile/catwalk_tile/flat_white + catwalk_type = "flatwhite" + +/turf/open/floor/catwalk_floor/titanium + name = "titanium plated catwalk floor" + icon_state = "titanium_above" + floor_tile = /obj/item/stack/tile/catwalk_tile/titanium + catwalk_type = "titanium" + +/turf/open/floor/catwalk_floor/iron_smooth //the original green type + name = "smooth plated catwalk floor" + icon_state = "smoothiron_above" + floor_tile = /obj/item/stack/tile/catwalk_tile/iron_smooth + catwalk_type = "smoothiron" + +/turf/open/floor/catwalk_floor/telecomms + initial_gas_mix = TCOMMS_ATMOS diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index f58f77d03e1f..35aad62ca50b 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -23,12 +23,17 @@ var/mask_icon = 'icons/turf/floors.dmi' /// The icon state that covers the lava bits of our turf var/mask_state = "lava-lightmask" + /// The temperature this lava will heat or cool radiator pipes to + var/lava_temperature = 5000 + /// The heat capacity of the lava, used by heat exchange pipes + var/lava_heat_capacity = 700000 /turf/open/lava/Initialize(mapload) . = ..() refresh_light() if(!smoothing_flags) update_appearance() + AddComponent(/datum/component/fishable/lava) /turf/open/lava/update_overlays() . = ..() @@ -127,7 +132,7 @@ STOP_PROCESSING(SSobj, src) /turf/open/lava/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) + switch(the_rcd.construction_mode) if(RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) return FALSE @@ -155,10 +160,10 @@ return TRUE /turf/open/lava/GetHeatCapacity() - . = 700000 + return lava_heat_capacity /turf/open/lava/GetTemperature() - . = 5000 + return lava_temperature /turf/open/lava/TakeTemperature(temp) diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 03ab8fbc4daa..2bf2f2c87af0 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -107,6 +107,20 @@ /turf/open/openspace/proc/CanBuildHere() return can_build_on +/turf/open/openspace/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + switch(the_rcd.construction_mode) + if(RCD_FLOORWALL) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) + return FALSE + +/turf/open/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_FLOORWALL) + to_chat(user, span_notice("You build a floor.")) + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return TRUE + return FALSE + /turf/open/openspace/attackby(obj/item/C, mob/user, params) ..() if(!CanBuildHere()) diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 39a06a9591d5..f370afc3123d 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -148,6 +148,20 @@ GLOBAL_LIST_EMPTY(starlight) return FALSE return TRUE +/turf/open/space/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + switch(the_rcd.construction_mode) + if(RCD_FLOORWALL) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) + return FALSE + +/turf/open/space/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_FLOORWALL) + to_chat(user, span_notice("You build a floor.")) + place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return TRUE + return FALSE + /turf/open/space/handle_slip() return diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index 61087e674021..fa5ce4bf686d 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -1,5 +1,5 @@ /turf/open/space/transit - name = "\proper hyperspace" + name = "\proper bluespace" desc = "What is this, light-speed? We need to go to plaid speed!" // spaceballs was a great movie icon_state = "black" dir = SOUTH diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm old mode 100644 new mode 100755 index f7922e820a45..4467d1c075d1 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -138,6 +138,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) //Yog code because there are some templates we load right into the map visibilityChanged() @@ -167,6 +168,14 @@ GLOBAL_LIST_EMPTY(station_turfs) update_air_ref(-1) __auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf())) + + if(uses_integrity) + update_integrity(max_integrity) + if(islist(armor)) + armor = getArmor(arglist(armor)) + else if(!armor) + armor = getArmor() + return INITIALIZE_HINT_NORMAL /turf/proc/__auxtools_update_turf_temp_info() @@ -343,6 +352,15 @@ GLOBAL_LIST_EMPTY(station_turfs) coil.place_turf(src, user) return TRUE + if(can_lay_cable() && istype(C, /obj/item/stack/ethernet_coil)) + var/obj/item/stack/ethernet_coil/coil = C + for(var/obj/structure/ethernet_cable/LC in src) + if(!LC.d1 || !LC.d2) + LC.attackby(C,user) + return + coil.place_turf(src, user) + return TRUE + else if(istype(C, /obj/item/rcl)) handleRCL(C, user) diff --git a/code/modules/VR/vr_compsci.dm b/code/modules/VR/vr_compsci.dm new file mode 100644 index 000000000000..5452767aaa71 --- /dev/null +++ b/code/modules/VR/vr_compsci.dm @@ -0,0 +1,160 @@ +GLOBAL_DATUM_INIT(compsci_vr, /datum/compsci_vr, new) +GLOBAL_LIST_EMPTY(compsci_mission_markers) +GLOBAL_VAR(compsci_vr_mission_reciever) +GLOBAL_LIST_EMPTY(last_used_transmuter) + + +/datum/compsci_vr + var/unlocked_missions = list() + + var/roundstart_missions = list( + /datum/compsci_mission/scientist_raid, + /datum/compsci_mission/combat_robot_factory, + /datum/compsci_mission/abandoned_mine + ) + + + var/datum/compsci_mission/current_mission + + var/mob/living/synth_occupied + + var/emagged = TRUE + + +/datum/compsci_vr/New() + . = ..() + unlocked_missions |= roundstart_missions + +/datum/compsci_vr/proc/can_join(mob/user) + return TRUE + +/datum/compsci_vr/proc/emag(mob/user) + emagged = TRUE + +/datum/compsci_vr/proc/complete_mission() + if(current_mission) + unlocked_missions -= current_mission.type + current_mission.complete() + GLOB.last_used_transmuter = null + QDEL_NULL(current_mission) + +/datum/compsci_vr/proc/start_mission(id, mob/user) + if(current_mission) + return + var/datum/compsci_mission/found_mission + for(var/datum/compsci_mission/unlocked as anything in unlocked_missions) + if(initial(unlocked.id) == id) + found_mission = unlocked + break + + if(!found_mission) + return + var/datum/compsci_mission/new_m = new found_mission() + current_mission = new_m + + var/obj/effect/landmark/vr_spawn/vr_mission/V_landmark = safepick(GLOB.compsci_mission_markers[current_mission.id]) + var/turf/T = get_turf(V_landmark) + var/datum/outfit/mission_outfit = new(V_landmark.vr_outfit) + if(user) + mission_outfit.equip(user) + user.forceMove(T) + +/datum/compsci_vr/proc/join_ongoing(mob/user) + if(!current_mission) + return + + var/obj/effect/landmark/vr_spawn/vr_mission/V_landmark = safepick(GLOB.compsci_mission_markers[current_mission.id]) + var/turf/T = get_turf(V_landmark) + var/datum/outfit/mission_outfit = new(V_landmark.vr_outfit) + if(user) + mission_outfit.equip(user) + user.forceMove(T) + + +/obj/machinery/computer/compsci_mission_selector + name = "exploration drone dispatch console" + desc = "Used for monitoring the various servers assigned to the AI network." + + icon_keyboard = "tech_key" + icon_screen = "ai-fixer" + light_color = LIGHT_COLOR_PINK + +/obj/machinery/computer/compsci_mission_selector/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CompsciMissionSelect", name) + ui.open() + +/obj/machinery/computer/compsci_mission_selector/ui_data(mob/living/carbon/human/user) + var/list/data = list() + data["missions"] = list() + data["ongoing"] = GLOB.compsci_vr.current_mission ? TRUE : FALSE + for(var/datum/compsci_mission/M as anything in GLOB.compsci_vr.unlocked_missions) + data["missions"] += list(list("name" = initial(M.name), "desc" = initial(M.desc), "id" = initial(M.id), "tags" = initial(M.tags))) + return data + +/obj/machinery/computer/compsci_mission_selector/ui_act(action, list/params) + if(..()) + return + + switch(action) + if("start_mission") + var/mission_id = params["mission_id"] + GLOB.compsci_vr.start_mission(mission_id, usr) + if("join_ongoing") + GLOB.compsci_vr.join_ongoing(usr) + + +/obj/machinery/compsci_reciever + name = "bluespace item transmuter" + desc = "Use this to send artifacts back ot the station" + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "transmuter" + layer = BELOW_OBJ_LAYER + density = TRUE + pass_flags = PASSTABLE + +/obj/machinery/compsci_reciever/Initialize(mapload) + . = ..() + var/turf/T = get_turf(src) + if(is_station_level(T.z)) + if(!GLOB.compsci_vr_mission_reciever) + GLOB.compsci_vr_mission_reciever = src + name = "bluespace item reciever" + desc = "Used to recieve artifacts from remote exploration parties." + +/obj/machinery/compsci_reciever/Destroy() + . = ..() + if(GLOB.compsci_vr_mission_reciever == src) + GLOB.compsci_vr_mission_reciever = null + if(GLOB.last_used_transmuter == src) + GLOB.last_used_transmuter = null + +/obj/machinery/compsci_reciever/attackby(obj/item/I, mob/living/user, params) + . = ..() + + if(GLOB.compsci_vr_mission_reciever == src && istype(I, /obj/item/disk/puzzle)) + if(GLOB.last_used_transmuter) + var/obj/machinery/compsci_reciever/CR = GLOB.last_used_transmuter + I.forceMove(CR.drop_location()) + GLOB.last_used_transmuter = null + return TRUE + return FALSE + + + if(GLOB.compsci_vr.current_mission && istype(I, GLOB.compsci_vr.current_mission.completion_item)) + var/obj/machinery/compsci_reciever/station_machine = GLOB.compsci_vr_mission_reciever + I.forceMove(station_machine.drop_location()) + if(GLOB.compsci_vr.current_mission.delete_completion_item) + qdel(I) + GLOB.compsci_vr.complete_mission() + to_chat(user, span_notice("Successfully transferred artifact. Now reverting to reality..")) + qdel(user) + return TRUE + + if(istype(I, /obj/item/disk/puzzle)) + var/obj/machinery/compsci_reciever/station_machine = GLOB.compsci_vr_mission_reciever + I.forceMove(station_machine.drop_location()) + to_chat(user, span_notice("Successfully transferred disk.")) + GLOB.last_used_transmuter = src + return TRUE diff --git a/code/modules/VR/vr_compsci_artifacts.dm b/code/modules/VR/vr_compsci_artifacts.dm new file mode 100644 index 000000000000..e359ca589864 --- /dev/null +++ b/code/modules/VR/vr_compsci_artifacts.dm @@ -0,0 +1,4 @@ +/obj/item/vr_artifact + name = "strange object" + desc = "What mysteries could this hold?" + icon = 'icons/obj/assemblies.dmi' diff --git a/code/modules/VR/vr_compsci_missions.dm b/code/modules/VR/vr_compsci_missions.dm new file mode 100644 index 000000000000..4481f5b8dc31 --- /dev/null +++ b/code/modules/VR/vr_compsci_missions.dm @@ -0,0 +1,70 @@ +#define VR_SPAWNER(_id, _outfit) \ + /obj/effect/landmark/vr_spawn/vr_mission/##_id { \ + id = #_id; \ + vr_outfit = #_outfit; \ + }; \ + + +GLOBAL_LIST_EMPTY(compsci_flags) + +#define MINE_FLAG "mine" + +/datum/compsci_mission + var/name + var/desc + var/id + var/completion_item + var/tags + + var/delete_completion_item = FALSE + +/datum/compsci_mission/proc/complete() + return + +/datum/outfit/vr/mission + + +/obj/effect/landmark/vr_spawn/vr_mission + var/id = "debug_mission" + vr_outfit = /datum/outfit/vr/mission + +/obj/effect/landmark/vr_spawn/vr_mission/Initialize(mapload) + . = ..() + LAZYADD(GLOB.compsci_mission_markers[id], src) + LAZYREMOVE(GLOB.vr_spawnpoints[vr_category], src) + +/obj/effect/landmark/vr_spawn/vr_mission/Destroy() + LAZYREMOVE(GLOB.compsci_mission_markers[id], src) + return ..() + +//ACTUAL MISSIONS START HERE + + +/datum/compsci_mission/scientist_raid + name = "Unknown Small Research Station" + desc = "A recurring distress beacon has been detected from a nearby unidentified research station." + id = "scientist_raid" + completion_item = /obj/item/ai_cpu/organic + +VR_SPAWNER(scientist_raid, /datum/outfit/vr/mission) + +/datum/compsci_mission/combat_robot_factory + name = "Abandoned Robot Factory" + desc = "The records for an old abandoned robot factory have been lost. You've been sent to remake the report." + id = "combat_robot_factory" + completion_item = /obj/item/ai_cpu/self_aware + +VR_SPAWNER(combat_robot_factory, /datum/outfit/vr/mission) + +/datum/compsci_mission/abandoned_mine + name = "Abandoned Mine" + desc = "The records for an old abandoned robot factory have been lost. You've been sent to remake the report." + id = "abandoned_mine" + completion_item = /obj/item/paper/fluff/awaymissions/mine_coordinates + delete_completion_item = TRUE + +/datum/compsci_mission/abandoned_mine/complete() + . = ..() + GLOB.compsci_flags[MINE_FLAG] = TRUE + +VR_SPAWNER(abandoned_mine, /datum/outfit/vr/mission) diff --git a/code/modules/VR/vr_human.dm b/code/modules/VR/vr_human.dm index 855d615d284a..719a676498a3 100644 --- a/code/modules/VR/vr_human.dm +++ b/code/modules/VR/vr_human.dm @@ -19,6 +19,8 @@ /mob/living/carbon/human/virtual_reality/Destroy() revert_to_reality() + for(var/obj/item/I in get_all_contents()) + dropItemToGround(I, TRUE, TRUE) return ..() /mob/living/carbon/human/virtual_reality/Life(seconds_per_tick = SSMOBS_DT, times_fired) @@ -42,7 +44,12 @@ /mob/living/carbon/human/virtual_reality/proc/check_area() var/area/check = get_area(src) - if(!check || !istype(check, /area/awaymission/vr)) + if(!check) + return + if(!istype(check, /area/awaymission/vr)) + to_chat(src, span_userdanger("It is unwise to attempt to break Virtual Reality.")) + playsound(src, 'sound/effects/supermatter.ogg', 50, 1) + dust() return var/area/awaymission/vr/A = check if(A.death) @@ -65,6 +72,7 @@ if(vr_sleeper.you_die_in_the_game_you_die_for_real) to_chat(real_mind, span_warning("You feel everything fading away...")) real_mind.current.death(0) + if(deathchecks && vr_sleeper) vr_sleeper.vr_human = null vr_sleeper = null @@ -84,3 +92,12 @@ VR.revert_to_reality(FALSE) else Remove(owner) + + +//Overwritten to ensure we don't get blocked by secret level checks +/mob/living/carbon/human/virtual_reality/forceMove(atom/destination) + . = FALSE + if(destination) + . = doMove(destination) + else + CRASH("No valid destination passed into forceMove") diff --git a/code/modules/VR/vr_netmin.dm b/code/modules/VR/vr_netmin.dm new file mode 100644 index 000000000000..411dd20bd66c --- /dev/null +++ b/code/modules/VR/vr_netmin.dm @@ -0,0 +1,32 @@ +/obj/machinery/vr_sleeper/netmin + desc = "A sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds. This one has been modifed to allow the occupant to control remote exploration robots." + + +/obj/machinery/vr_sleeper/netmin/emag_act(mob/user) + if(!GLOB.compsci_vr.emagged) + GLOB.compsci_vr.emag() + +/obj/machinery/vr_sleeper/netmin/get_vr_spawnpoint() //proc so it can be overridden for team games or something + return safepick(GLOB.vr_spawnpoints[vr_category]) + + +/obj/machinery/vr_sleeper/netmin/ui_act(action, params) + if(action == "vr_connect") + if(!GLOB.compsci_vr.can_join(usr)) + to_chat(usr, span_warning("Someone else is already connected!")) + return + . = ..() + +/obj/machinery/vr_sleeper/netmin/synth_only + name = "virtual reality endpoint" + desc = "A sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds. This one has been modifed to allow only a synthetic to control remote exploration robots." + +/obj/machinery/vr_sleeper/netmin/synth_only/ui_act(action, params) + if(action == "vr_connect") + if(!is_synth(usr)) + to_chat(usr, span_warning("Only synthetics may use this endpoint!")) + return + if(!GLOB.compsci_vr.can_join(usr)) + to_chat(usr, span_warning("Someone else is already connected!")) + return + . = ..() diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index af38ac4bd161..5516beaadeed 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -86,8 +86,9 @@ close_machine(target) /obj/machinery/vr_sleeper/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "vr_sleeper", "VR Sleeper") + ui = new(user, src, "VRSleeper", name) ui.open() /obj/machinery/vr_sleeper/ui_act(action, params) @@ -151,7 +152,6 @@ status = "Barely Conscious" data["vr_avatar"] = list("name" = vr_human.name, "status" = status, "health" = vr_human.health, "maxhealth" = vr_human.maxHealth) data["toggle_open"] = state_open - data["emagged"] = you_die_in_the_game_you_die_for_real data["isoccupant"] = (user == occupant) return data diff --git a/code/modules/admin/greyscale_modify_menu.dm b/code/modules/admin/greyscale_modify_menu.dm new file mode 100644 index 000000000000..e9936723f78a --- /dev/null +++ b/code/modules/admin/greyscale_modify_menu.dm @@ -0,0 +1,324 @@ +/// The controller for the ui in charge of all runtime greyscale configuration/debug. +/// If `Unlock()` is not called the menu is safe for players to use. +/datum/greyscale_modify_menu + /// The "owner" object of this menu, is usually the greyscale object being edited but that can be changed for specific uses of this menu + var/atom/target + /// The client that opened this menu + var/client/user + + /// A keyed list of allowed configs in the form niceName:typepath + var/list/allowed_configs + + /// A callback to control what happens when the user presses apply. Used mainly for if you want the menu to be used outside of vv. + var/datum/callback/apply_callback + + /// The current config being previewed + var/datum/greyscale_config/config + /// A list of colors currently selected + var/list/split_colors + + /// The type that the configuration file was assigned at + var/config_owner_type + + /// Collection of data for tgui to use in displaying everything + var/list/sprite_data + /// The sprite dir currently being shown + var/sprite_dir = SOUTH + /// The sprite icon state currently being shown + var/icon_state + /// Whether the full preview should be generated, with this FALSE only the final sprite is shown instead of all steps. + var/generate_full_preview = FALSE + + /// Whether the menu is in the middle of refreshing the preview + var/refreshing = TRUE + + /// Whether the menu is currently locked down to prevent abuse from players. Currently is only unlocked when opened from vv. + var/unlocked = FALSE + +/datum/greyscale_modify_menu/New(atom/target, client/user, list/allowed_configs, datum/callback/apply_callback, starting_icon_state="", starting_config, starting_colors) + src.target = target + src.user = user + src.apply_callback = apply_callback || CALLBACK(src, PROC_REF(DefaultApply)) + icon_state = starting_icon_state + + SetupConfigOwner() + + var/current_config = "[starting_config]" || "[target?.greyscale_config]" + var/datum/greyscale_config/new_config = SSgreyscale.configurations[current_config] + if(!(current_config in allowed_configs)) + new_config = SSgreyscale.configurations["[allowed_configs[pick(allowed_configs)]]"] + change_config(new_config) + + var/list/config_choices = list() + for(var/config_string in allowed_configs) + var/datum/greyscale_config/allowed_config = text2path("[config_string]") + config_choices[initial(allowed_config.name)] = config_string + src.allowed_configs = config_choices + + ReadColorsFromString(starting_colors || target?.greyscale_colors) + + if(target) + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(ui_close)) + + refresh_preview() + +/datum/greyscale_modify_menu/Destroy() + target = null + user = null + return ..() + +/datum/greyscale_modify_menu/ui_state(mob/user) + return GLOB.always_state + +/datum/greyscale_modify_menu/ui_close() + qdel(src) + +/datum/greyscale_modify_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "GreyscaleModifyMenu") + ui.open() + +/datum/greyscale_modify_menu/ui_data(mob/user) + var/list/data = list() + data["greyscale_config"] = "[config.name]" + + var/list/color_data = list() + data["colors"] = color_data + for(var/i in 1 to config.expected_colors) + color_data += list(list( + "index" = i, + "value" = split_colors[i] + )) + + data["generate_full_preview"] = generate_full_preview + data["unlocked"] = unlocked + data["refreshing"] = refreshing + data["monitoring_files"] = !!(config.datum_flags & DF_ISPROCESSING) + data["sprites_dir"] = dir2text(sprite_dir) + data["icon_state"] = icon_state + data["sprites"] = sprite_data + return data + +/datum/greyscale_modify_menu/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("select_config") + var/datum/greyscale_config/new_config = input( + usr, + "Choose a new greyscale configuration to use", + "Greyscale Modification Menu", + "[config.type]" + ) as anything in allowed_configs + new_config = allowed_configs[new_config] + new_config = SSgreyscale.configurations[new_config] || new_config + if(!isnull(new_config) && config != new_config) + change_config(new_config) + queue_refresh() + + if("load_config_from_string") + if(!(params["config_string"] in allowed_configs)) + return + var/datum/greyscale_config/new_config = SSgreyscale.configurations[params["config_string"]] + if(!isnull(new_config) && config != new_config) + change_config(new_config) + queue_refresh() + + if("toggle_full_preview") + if(!generate_full_preview && !unlocked) + return + generate_full_preview = !generate_full_preview + queue_refresh() + + if("recolor") + var/index = text2num(params["color_index"]) + var/new_color = lowertext(params["new_color"]) + if(split_colors[index] != new_color) + split_colors[index] = new_color + queue_refresh() + + if("recolor_from_string") + var/full_color_string = lowertext(params["color_string"]) + if(full_color_string != split_colors.Join()) + ReadColorsFromString(full_color_string) + queue_refresh() + + if("pick_color") + var/group = params["color_index"] + var/new_color = input( + usr, + "Choose color for greyscale color group [group]:", + "Greyscale Modification Menu", + split_colors[group] + ) as color|null + if(new_color) + split_colors[group] = new_color + queue_refresh() + + if("random_color") + var/group = text2num(params["color_index"]) + randomize_color(group) + queue_refresh() + + if("random_all_colors") + for(var/i in 1 to length(split_colors)) + randomize_color(i) + queue_refresh() + + if("select_icon_state") + var/new_icon_state = params["new_icon_state"] + if(!config.icon_states[new_icon_state]) + return + icon_state = new_icon_state + queue_refresh() + + if("apply") + apply_callback.Invoke(src) + + if("refresh_file") + if(!unlocked || !check_rights(R_DEBUG)) + return + if(length(GLOB.player_list) > 1) + var/check = alert( + user, +{"Other players are connected to the server, are you sure you want to refresh all greyscale configurations?\n +This is highly likely to cause a lag spike for a few seconds."}, + "Refresh Greyscale Configurations", + "Yes", + "Cancel" + ) + if(check != "Yes") + return + config.Refresh(loadFromDisk=TRUE) + + if("save_dmi") + if(!unlocked) + return + config.SaveOutput(split_colors.Copy(1, config.expected_colors+1)) + + if("change_dir") + sprite_dir = text2dir(params["new_sprite_dir"]) + queue_refresh() + + if("toggle_mass_refresh") + if(!unlocked || !check_rights(R_DEBUG)) + return + if(config.datum_flags & DF_ISPROCESSING) + config.DisableAutoRefresh(remove_all=TRUE) + return + if(length(GLOB.player_list) > 1) + var/check = alert( + user, +{"Other players are connected to the server, are you sure you want to automatically refresh all greyscale configurations?\n +This is highly likely to cause massive amounts of lag as every object in the game will be iterated over every few seconds."}, + "Auto-Refresh Greyscale Configurations", + "Yes", + "Cancel" + ) + if(check != "Yes") + return + config.EnableAutoRefresh(config_owner_type) + +/datum/greyscale_modify_menu/proc/ReadColorsFromString(colorString) + var/list/raw_colors = splittext(colorString, "#") + split_colors = list() + for(var/i in 2 to length(raw_colors)) + split_colors += "#[raw_colors[i]]" + +/datum/greyscale_modify_menu/proc/randomize_color(color_index) + var/new_color = "#" + for(var/i in 1 to 3) + new_color += num2hex(rand(0, 255), 2) + split_colors[color_index] = new_color + +/datum/greyscale_modify_menu/proc/change_config(datum/greyscale_config/new_config) + if(config) + UnregisterSignal(config, COMSIG_GREYSCALE_CONFIG_REFRESHED) + config = new_config + RegisterSignal(config, COMSIG_GREYSCALE_CONFIG_REFRESHED, PROC_REF(queue_refresh)) + +/datum/greyscale_modify_menu/proc/queue_refresh() + SIGNAL_HANDLER + refreshing = TRUE + addtimer(CALLBACK(src, PROC_REF(refresh_preview)), 1 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + +/datum/greyscale_modify_menu/proc/refresh_preview() + for(var/i in length(split_colors) + 1 to config.expected_colors) + split_colors += rgb(100, 100, 100) + var/list/used_colors = split_colors.Copy(1, config.expected_colors+1) + + sprite_data = list() + + var/list/generated_icon_states = list() + for(var/state in config.icon_states) + generated_icon_states += state // We don't want the values from this keyed list + sprite_data["icon_states"] = generated_icon_states + + if(!(icon_state in generated_icon_states)) + icon_state = target.icon_state + if(!(icon_state in generated_icon_states)) + icon_state = pick(generated_icon_states) + + var/image/finished + var/time_spent = TICK_USAGE + if(!generate_full_preview) + finished = image(config.GenerateBundle(used_colors), icon_state=icon_state) + time_spent = TICK_USAGE - time_spent + else + var/list/data = config.GenerateDebug(used_colors.Join()) + time_spent = TICK_USAGE - time_spent + finished = image(data["icon"], icon_state=icon_state) + var/list/steps = list() + sprite_data["steps"] = steps + var/list/icon_state_data = data["steps"][icon_state] + for(var/list/step as anything in icon_state_data) + CHECK_TICK + var/image/layer = image(step["step"]) + var/image/result = image(step["result"]) + steps += list( + list( + "layer"=icon2html(layer, user, dir=sprite_dir, sourceonly=TRUE), + "result"=icon2html(result, user, dir=sprite_dir, sourceonly=TRUE), + "config_name"=step["config_name"] + ) + ) + + sprite_data["time_spent"] = TICK_DELTA_TO_MS(time_spent) + sprite_data["finished"] = icon2html(finished, user, dir=sprite_dir, sourceonly=TRUE) + refreshing = FALSE + +/datum/greyscale_modify_menu/proc/Unlock() + allowed_configs = SSgreyscale.configurations + unlocked = TRUE + +/datum/greyscale_modify_menu/proc/DefaultApply() + target.set_greyscale(split_colors, config.type) + +/// Gets the top level type that first uses the configuration in this type path +/datum/greyscale_modify_menu/proc/SetupConfigOwner() + var/atom/current = target.type + var/atom/parent = target.parent_type + if(!initial(current.greyscale_config)) + return + while(initial(current.greyscale_config) == initial(parent.greyscale_config)) + current = parent + parent = type2parent(current) + config_owner_type = current + +/// Used for spray painting items in the gags_recolorable component +/datum/greyscale_modify_menu/spray_paint + var/obj/item/toy/crayon/spraycan/spraycan = null + +/datum/greyscale_modify_menu/spray_paint/New(atom/target, client/user, list/allowed_configs, datum/callback/apply_callback, starting_icon_state, starting_config, starting_colors, obj/item/toy/crayon/spraycan/used_spraycan) + ..() + spraycan = used_spraycan + +/datum/greyscale_modify_menu/spray_paint/ui_status(mob/user, datum/ui_state/state) + return min( + ui_status_only_living(user, target), + ui_status_user_is_abled(user, target), + ui_status_user_strictly_adjacent(user, target), + user.is_holding(spraycan)? UI_INTERACTIVE : UI_CLOSE + ) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 89599ce142d2..dec80db6a818 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1139,3 +1139,11 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) return if(tgui_alert(usr, "Are you absolutely sure you want to reload the configuration from the default path on the disk, wiping any in-round modificatoins?", "Really reset?", list("No", "Yes")) == "Yes") config.admin_reload() + +/client/proc/debug_ai_networks() + set category = "Misc.Server Debug" + set name = "Debug AI Networks" + set desc = "Displays a list of all AI networks to ALL admins" + if(!check_rights(R_DEBUG)) + return + _debug_ai_networks() diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index f7d256dd3e59..2cba86076e39 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_all, list( /client/proc/cmd_display_init_log, /client/proc/cmd_display_overlay_log, /client/proc/reload_configuration, + /client/proc/debug_ai_networks, /datum/admins/proc/create_or_modify_area, /client/proc/debug_typeof, // Yogs -- Adds a debug verb for getting the subtypes of something /client/proc/toggle_cdn, diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9dde10f43dd8..4b531f32589a 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -888,7 +888,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/level = input("Select security level to change to","Set Security Level") as null|anything in list("green","blue","red","gamma","epsilon","delta") if(level) - set_security_level(level) + SSsecurity_level.set_level(level) log_admin("[key_name(usr)] changed the security level to [level]") message_admins("[key_name_admin(usr)] changed the security level to [level]") @@ -1146,8 +1146,8 @@ Traitors and the like can also be revived with the previous role mostly intact. ADMIN_PUNISHMENT_PERFORATE, ADMIN_PUNISHMENT_SCARIFY, ADMIN_PUNISHMENT_SMSPIDER, - ADMIN_PUNISHMENT_FLASHBANG - ) + ADMIN_PUNISHMENT_FLASHBANG, + ADMIN_PUNISHMENT_WIBBLY) var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list @@ -1331,6 +1331,10 @@ Traitors and the like can also be revived with the previous role mostly intact. CB.prime() chucklenuts.flash_act() + if(ADMIN_PUNISHMENT_WIBBLY) + apply_wibbly_filters(target, 888) + to_chat(target, span_warning("Something feels very... wibbly!")) + punish_log(target, punishment) /** diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 4e929a7afe25..b71ba1857e90 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -90,8 +90,16 @@ else datumname = "element" target._AddElement(lst) - log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(target)].") - message_admins(span_notice("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(target)].")) + log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].") + message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") + + if(href_list[VV_HK_MODIFY_GREYSCALE]) + if(!check_rights(NONE)) + return + var/datum/greyscale_modify_menu/menu = new(target, usr, SSgreyscale.configurations) + menu.Unlock() + menu.ui_interact(usr) + if(href_list[VV_HK_REMOVECOMPONENT] || href_list[VV_HK_MASS_REMOVECOMPONENT]) if(!check_rights(NONE)) return @@ -135,5 +143,6 @@ qdel(to_delete) message_admins(span_notice("[key_name_admin(usr)] has [mass_remove? "mass" : ""] removed [path] component from [mass_remove? target.type : key_name_admin(target)].")) + if(href_list[VV_HK_CALLPROC]) usr.client.callproc_datum(target) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 47c051bb5f21..6c2b42eec785 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -797,8 +797,14 @@ Congratulations! You are now trained for invasive xenobiology research!"} var/static/list/injected_reagents = list(/datum/reagent/medicine/corazone) -/obj/structure/table/optable/abductor/Crossed(atom/movable/AM) +/obj/structure/table/optable/abductor/Initialize(mapload) . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM, ...) if(iscarbon(AM)) START_PROCESSING(SSobj, src) to_chat(AM, span_danger("You feel a series of tiny pricks!")) diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index 3698fdeafc78..aa0bf488243f 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ if(resource_delay <= world.time) resource_delay = world.time + 10 // 1 second overmind.add_points(point_rate) - overmind.blob_core.obj_integrity = min(overmind.blob_core.max_integrity, overmind.blob_core.obj_integrity+core_regen) + overmind.blob_core.update_integrity(min(overmind.blob_core.max_integrity, overmind.blob_core.get_integrity()+core_regen)) /datum/blobstrain/proc/attack_living(mob/living/L, list/nearby_blobs) // When the blob attacks people send_message(L) diff --git a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm index d82f0c4ee60d..9e7bf136ca27 100644 --- a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm +++ b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm @@ -11,7 +11,7 @@ reagent = /datum/reagent/blob/distributed_neurons /datum/blobstrain/reagent/distributed_neurons/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && B.obj_integrity - damage <= 0 && prob(15)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 15% chance of a shitty spore. + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && B.get_integrity() - damage <= 0 && prob(15)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 15% chance of a shitty spore. B.visible_message("A spore floats free of the blob!") var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc) BS.overmind = B.overmind diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm index 5af8788f5f5f..ba851f8c9d65 100644 --- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm @@ -10,7 +10,7 @@ reagent = /datum/reagent/blob/energized_jelly /datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && B.obj_integrity - damage <= 0 && prob(10)) + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && B.get_integrity() - damage <= 0 && prob(10)) do_sparks(rand(2, 4), FALSE, B) return ..() diff --git a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm index 96a91872a37a..302261ca22cd 100644 --- a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm @@ -12,7 +12,7 @@ reagent = /datum/reagent/blob/reactive_spines /datum/blobstrain/reagent/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive + if(damage && damage_type == BRUTE && B.get_integrity() - damage > 0) //is there any damage, is it brute, and will we be alive if(damage_flag == MELEE) B.visible_message(span_boldwarning("The blob retaliates, lashing out!")) for(var/atom/A in range(1, B)) diff --git a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm index 3a089efc6474..15319ddb5a71 100644 --- a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm +++ b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm @@ -13,10 +13,10 @@ /datum/blobstrain/reagent/replicating_foam/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage_type == BRUTE) damage = damage * 2 - else if(damage_type == BURN && damage > 0 && B.obj_integrity - damage > 0 && prob(60)) + else if(damage_type == BURN && damage > 0 && B.get_integrity() - damage > 0 && prob(60)) var/obj/structure/blob/newB = B.expand(null, null, 0) if(newB) - newB.obj_integrity = B.obj_integrity - damage + newB.update_integrity(B.get_integrity() - damage) newB.update_appearance(UPDATE_ICON) return ..() diff --git a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm index 1e3ebf1abbe6..c7c35c535c82 100644 --- a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm +++ b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm @@ -15,7 +15,7 @@ B.forceMove(T) /datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage)) + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage > 0 && B.get_integrity() - damage > 0 && prob(60-damage)) var/list/blobstopick = list() for(var/obj/structure/blob/OB in orange(1, B)) if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type) diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 3c79ce8c687e..0f7a83e7ad20 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -45,9 +45,12 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/announcement_time var/has_announced = FALSE var/basemodifier = 1 + var/contained = FALSE /mob/camera/blob/Initialize(mapload, starting_points = 60, pointmodifier = 1, announcement_delay = 6000) validate_location() + if(starting_points > max_blob_points) + max_blob_points = starting_points blob_points = starting_points basemodifier = pointmodifier manualplace_min_time += world.time @@ -115,7 +118,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) else if(!victory_in_progress && (blobs_legit.len >= blobwincount)) victory_in_progress = TRUE priority_announce("Biohazard has reached critical mass. Station loss is imminent.", "Biohazard Alert") - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) max_blob_points = INFINITY blob_points = INFINITY blob_core.max_integrity = 999999 @@ -127,9 +130,19 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(!victory_in_progress && max_count < blobs_legit.len) max_count = blobs_legit.len - if((world.time >= announcement_time || blobs_legit.len >= announcement_size) && !has_announced) - priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/default/outbreak5.ogg') - has_announced = TRUE + if((world.time >= announcement_time || blobs_legit.len >= announcement_size) && (!has_announced || !contained)) + if(check_containment(blob_core, 5) && !contained && !has_announced) + priority_announce("Confirmed outbreak of level 5 biohazard containment successfully aboard [station_name()].", "Biohazard Containment Alert", 'sound/misc/notice1.ogg', color_override="green") + contained = TRUE + SSshuttle.clearHostileEnvironment(src) + else if(!check_containment(blob_core, 5) && contained && !has_announced) + priority_announce("Confirmed outbreak of level 5 biohazard containment breach detected aboard [station_name()], coordinations: x[blob_core.x] y[blob_core.y] z[blob_core.z]. All personnel must attempt to re-contain, otherwise station loss is inevitable.", "Biohazard Containment Alert", 'sound/misc/notice1.ogg', color_override="red") + contained = FALSE + has_announced = TRUE + SSshuttle.registerHostileEnvironment(src) + else if(!check_containment(blob_core, 5) && !contained && !has_announced) + priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/default/outbreak5.ogg', color_override="yellow") + has_announced = TRUE /mob/camera/blob/proc/victory() sound_to_playing_players('sound/machines/alarm.ogg') @@ -209,15 +222,15 @@ GLOBAL_LIST_EMPTY(blob_nodes) /mob/camera/blob/update_health_hud() if(blob_core) - var/current_health = round((blob_core.obj_integrity / blob_core.max_integrity) * 100) - hud_used.healths.maptext = "
[current_health]%
" + var/current_health = round((blob_core.get_integrity() / blob_core.max_integrity) * 100) + hud_used?.healths.maptext = "
[current_health]%
" for(var/mob/living/simple_animal/hostile/blob/blobbernaut/B in blob_mobs) if(B.hud_used && B.hud_used.blobpwrdisplay) B.hud_used.blobpwrdisplay.maptext = "
[current_health]%
" /mob/camera/blob/proc/add_points(points) blob_points = clamp(blob_points + points, 0, max_blob_points) - hud_used.blobpwrdisplay.maptext = "
[round(blob_points)]
" + hud_used?.blobpwrdisplay.maptext = "
[round(blob_points)]
" /mob/camera/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) if (!message) @@ -260,7 +273,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) /mob/camera/blob/get_status_tab_items() . = ..() if(blob_core) - . += "Core Health: [blob_core.obj_integrity]" + . += "Core Health: [blob_core.get_integrity()]" . += "Power Stored: [blob_points]/[max_blob_points]" . += "Blobs to Win: [blobs_legit.len]/[blobwincount]" if(free_strain_rerolls) diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index 214cb9dcd6c7..d64d4ee481b7 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -122,7 +122,7 @@ if(S) if(!can_buy(BLOB_REFLECTOR_COST)) return - if(S.obj_integrity < S.max_integrity * 0.5) + if(S.get_integrity() < S.max_integrity * 0.5) add_points(BLOB_REFLECTOR_COST) to_chat(src, span_warning("This shield blob is too damaged to be modified properly!")) return @@ -161,7 +161,7 @@ if(B.naut) //if it already made a blobbernaut, it can't do it again to_chat(src, span_warning("This factory blob is already sustaining a blobbernaut.")) return - if(B.obj_integrity < B.max_integrity * 0.5) + if(B.get_integrity() < B.max_integrity * 0.5) to_chat(src, span_warning("This factory blob is too damaged to sustain a blobbernaut.")) return if(!can_buy(40)) @@ -172,7 +172,7 @@ var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as a [blobstrain.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly if(LAZYLEN(candidates)) //if we got at least one candidate, they're a blobbernaut now. B.max_integrity = initial(B.max_integrity) * 0.25 //factories that produced a blobbernaut have much lower health - B.obj_integrity = min(B.obj_integrity, B.max_integrity) + B.update_integrity(min(B.get_integrity(), B.max_integrity)) B.update_appearance(UPDATE_ICON) B.visible_message(span_warning("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!")) playsound(B.loc, 'sound/effects/splat.ogg', 50, 1) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index e7937f7781bc..1a4a880c6d91 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/blob.dmi' light_range = 2 desc = "A thick wall of writhing tendrils." - density = FALSE //this being false causes two bugs, being able to attack blob tiles behind other blobs and being unable to move on blob tiles in no gravity, but turning it to 1 causes the blob mobs to be unable to path through blobs, which is probably worse. + density = TRUE opacity = FALSE anchored = TRUE layer = BELOW_MOB_LAYER @@ -127,7 +127,7 @@ if(pulse_timestamp <= world.time) ConsumeTile() if(heal_timestamp <= world.time) - obj_integrity = min(max_integrity, obj_integrity+health_regen) + update_integrity(min(max_integrity, atom_integrity + health_regen)) heal_timestamp = world.time + 20 update_appearance(UPDATE_ICON) pulse_timestamp = world.time + 10 @@ -253,7 +253,7 @@ /obj/structure/blob/proc/typereport(mob/user) RETURN_TYPE(/list) return list("Blob Type: [span_notice("[uppertext(initial(name))]")]", - "Health: [span_notice("[obj_integrity]/[max_integrity]")]", + "Health: [span_notice("[atom_integrity]/[max_integrity]")]", "Effects: [span_notice("[scannerreport()]")]") /obj/structure/blob/attack_animal(mob/living/simple_animal/M) @@ -271,7 +271,7 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) -/obj/structure/blob/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/obj/structure/blob/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) switch(damage_type) if(BRUTE) damage_amount *= brute_resist @@ -290,10 +290,10 @@ /obj/structure/blob/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - if(. && obj_integrity > 0) + if(. && atom_integrity > 0) update_appearance(UPDATE_ICON) -/obj/structure/blob/obj_destruction(damage_flag) +/obj/structure/blob/atom_destruction(damage_flag) if(overmind) overmind.blobstrain.death_reaction(src, damage_flag) ..() @@ -336,19 +336,22 @@ name = "normal blob" icon_state = "blob" light_range = 0 - obj_integrity = 21 //doesn't start at full health max_integrity = 25 health_regen = 1 brute_resist = 0.25 +/obj/structure/blob/normal/Initialize(mapload, owner_overmind) + . = ..() + update_integrity(21) //doesn't start at full health + /obj/structure/blob/normal/scannerreport() - if(obj_integrity <= 15) + if(atom_integrity <= 15) return "Currently weak to brute damage." return "N/A" /obj/structure/blob/normal/update_appearance(updates=ALL) . = ..() - if(obj_integrity <= 15) + if(atom_integrity <= 15) icon_state = "blob_damaged" name = "fragile blob" desc = "A thin lattice of slightly twitching tendrils." diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index d99bd10d4b36..4d0591621070 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -51,7 +51,7 @@ /obj/structure/blob/core/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0, overmind_reagent_trigger = 1) . = ..() - if(obj_integrity > 0) + if(atom_integrity > 0) if(overmind) //we should have an overmind, but... overmind.update_health_hud() @@ -60,6 +60,11 @@ return if(!overmind) qdel(src) + if(check_containment(src, 5)) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_GENERIC, 3000) + var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) + if(D) + D.adjust_money(5000) if(overmind) overmind.blobstrain.core_process() overmind.update_health_hud() @@ -69,6 +74,31 @@ B.change_to(/obj/structure/blob/shield/core, overmind) ..() +/proc/check_containment(atom/source, range) + var/safe = locate(/obj/machinery/field/containment) in urange(range, source, 1) + if(safe) + return TRUE + else + return FALSE + +/obj/structure/blob/core/attack_ghost(mob/user) + . = ..() + become_blob(user) + +/obj/structure/blob/core/proc/become_blob(mob/user) + if(is_banned_from(user.key, ROLE_BLOB)) + to_chat(user, span_warning("You are banned from being a blob!")) + return + if(overmind.key) + to_chat(user, span_warning("Someone else already took this [overmind.name]!")) + return + var/blob_ask = tgui_alert(user,"Become [overmind.name]?", "BLOBBER", list("Yes", "No")) + if(blob_ask == "No" || QDELETED(overmind)) + return + overmind.key = user.key + log_game("[key_name(user)] took control of [overmind.name].") + message_admins("[key_name(user)] took control of [overmind.name]. [ADMIN_JMP(overmind)].") + /obj/structure/blob/core/on_changed_z_level(turf/old_turf, turf/new_turf) if(overmind && is_station_level(new_turf.z)) overmind.forceMove(get_turf(src)) diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index fd34cb45ecb1..4c99b780a46a 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -21,7 +21,7 @@ /obj/structure/blob/shield/update_appearance(updates=ALL) . = ..() - if(obj_integrity < max_integrity * 0.5) + if(atom_integrity < max_integrity * 0.5) icon_state = "[initial(icon_state)]_damaged" name = "weakened [initial(name)]" desc = "[damaged_desc]" diff --git a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm index 8fd824cf1042..3f87d1a1a41d 100644 --- a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm +++ b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm @@ -179,6 +179,33 @@ else .["Break Masquerade"] = CALLBACK(src, PROC_REF(break_masquerade)) + if(!my_clan) + .["Force Clan"] = CALLBACK(src, PROC_REF(force_clan)) + +/datum/antagonist/bloodsucker/proc/force_clan(mob/admin) + if(my_clan) + return + + var/list/clans = list() + for(var/datum/bloodsucker_clan/all_clans as anything in typesof(/datum/bloodsucker_clan)) + if(initial(all_clans.joinable_clan)) + clans |= all_clans + clans |= "vvv Not regularly joinable vvv" + clans |= typesof(/datum/bloodsucker_clan) + + var/chosen = tgui_input_list(admin, "Select which clan to force on the target.", "Select Clan", clans) + if(!chosen || !ispath(chosen, /datum/bloodsucker_clan)) + return + + if(QDELETED(src) || QDELETED(owner.current)) + return + if(my_clan) + to_chat(admin, span_warning("error, clan already picked")) + return + + my_clan = new chosen(src) + owner.announce_objectives() + ///Called when you get the antag datum, called only ONCE per antagonist. /datum/antagonist/bloodsucker/on_gain() RegisterSignal(SSsunlight, COMSIG_SOL_RANKUP_BLOODSUCKERS, PROC_REF(sol_rank_up)) @@ -564,9 +591,7 @@ if(user_eyes) user_eyes.flash_protect = initial(user_eyes.flash_protect) user_eyes.sight_flags = initial(user_eyes.sight_flags) - user.lighting_cutoff_red += 5 - user.lighting_cutoff_green += 15 - user.lighting_cutoff_blue += 5 + user_eyes.color_cutoffs = initial(user_eyes.color_cutoffs) user.update_sight() /datum/antagonist/bloodsucker/proc/give_masquerade_infraction() diff --git a/code/modules/antagonists/bloodsuckers/clans/clan_lasombra.dm b/code/modules/antagonists/bloodsuckers/clans/clan_lasombra.dm index f0e77d742f3e..ef0ad64068b6 100644 --- a/code/modules/antagonists/bloodsuckers/clans/clan_lasombra.dm +++ b/code/modules/antagonists/bloodsuckers/clans/clan_lasombra.dm @@ -59,6 +59,11 @@ vassal.eye_color = BLOODCULT_EYE vassal.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) ADD_TRAIT(vassal, CULT_EYES, BLOODSUCKER_TRAIT) + var/obj/item/organ/eyes/current_eyes = vassal.getorganslot(ORGAN_SLOT_EYES) + if(current_eyes) + current_eyes.color_cutoffs = list(25, 8, 5) + current_eyes.lighting_cutoff = LIGHTING_CUTOFF_REAL_LOW + vassal.update_body() vassal.update_sight() vassal.update_appearance() diff --git a/code/modules/antagonists/bloodsuckers/powers/targeted/hecata.dm b/code/modules/antagonists/bloodsuckers/powers/targeted/hecata.dm index d6a55ad0705e..042c59614e16 100644 --- a/code/modules/antagonists/bloodsuckers/powers/targeted/hecata.dm +++ b/code/modules/antagonists/bloodsuckers/powers/targeted/hecata.dm @@ -32,6 +32,7 @@ target_range = 1 prefire_message = "Select a target." var/list/zombies = list() + var/ghost_searching = FALSE /datum/action/cooldown/bloodsucker/targeted/hecata/necromancy/Grant(mob/user) . = ..() @@ -53,9 +54,8 @@ . = ..() if(!.) return FALSE - // No mind - if(!target_atom.mind) - to_chat(owner, span_warning("[target_atom] is mindless.")) + if(ghost_searching) + to_chat(owner, span_notice("Your previous use of necromancy is still doing it's work.")) return FALSE // Bloodsucker if(IS_BLOODSUCKER(target_atom)) @@ -70,6 +70,17 @@ if(HAS_TRAIT(target_atom, TRAIT_MINDSHIELD) && !rack) to_chat(owner, span_warning("[target_atom]'s mindshield interferes with [src], put [target_atom.p_them()] on a persuasion rack first.")) return FALSE + // No mind + if(!target_atom.grab_ghost())//only call for a ghost if the existing one is gone + ghost_searching = TRUE + to_chat(owner, span_warning("Attempting to call a spirit from beyond the grave to possess [target_atom].")) + var/list/candidates = pollGhostCandidates("Would you like to play as a hecata zombie?", ROLE_BLOODSUCKER, null, null, poll_time = 5 SECONDS) + ghost_searching = FALSE + if(!LAZYLEN(candidates)) + to_chat(owner, span_warning("You were unable to call a spirit back from the afterlife.")) + return FALSE + var/mob/dead/observer/C = pick(candidates) + target_atom.key = C.key return TRUE /datum/action/cooldown/bloodsucker/targeted/hecata/necromancy/FireTargetedPower(atom/target_atom) diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_coffin.dm index 153c94faa3c5..1bacadbce0c0 100644 --- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_coffin.dm +++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_coffin.dm @@ -6,7 +6,7 @@ else to_chat(owner, "This [claimed.name] has already been claimed by another.") return FALSE - if(!LAZYFIND(GLOB.the_station_areas, current_area)) + if(!LAZYFIND(GLOB.the_station_areas, current_area.type)) claimed.balloon_alert(owner.current, "not part of station!") return // This is my Lair @@ -196,30 +196,37 @@ return TRUE /// You cannot weld or deconstruct an owned coffin. Only the owner can destroy their own coffin. -/obj/structure/closet/crate/coffin/attackby(obj/item/item, mob/user, params) - if(!resident) - return ..() - if(user != resident) - if(istype(item, cutting_tool)) - to_chat(user, span_notice("This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].")) - return - if(anchored && (item.tool_behaviour == TOOL_WRENCH)) - to_chat(user, span_danger("The coffin won't come unanchored from the floor.[user == resident ? " You can Alt-Click to unclaim and unwrench your Coffin." : ""]")) - return +/obj/structure/closet/crate/coffin/welder_act(mob/living/user, obj/item/tool) + if(user.a_intent != INTENT_HARM && resident && resident != user) + to_chat(user, span_notice("This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].")) + return TRUE + return ..() + +/obj/structure/closet/crate/coffin/wirecutter_act(mob/living/user, obj/item/tool) + if(user.a_intent != INTENT_HARM && resident && resident != user && tool.tool_behaviour == cutting_tool) + to_chat(user, span_notice("This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].")) + return TRUE + return ..() - if(locked && (item.tool_behaviour == TOOL_CROWBAR)) - var/pry_time = pry_lid_timer * item.toolspeed // Pry speed must be affected by the speed of the tool. +/obj/structure/closet/crate/coffin/crowbar_act(mob/living/user, obj/item/tool) + if(locked && resident) user.visible_message( - span_notice("[user] tries to pry the lid off of [src] with [item]."), - span_notice("You begin prying the lid off of [src] with [item]. This should take about [DisplayTimeText(pry_time)].")) - if(!do_after(user, pry_time, src)) - return + span_notice("[user] tries to pry the lid off of [src] with [tool]."), + span_notice("You begin prying the lid off of [src] with [tool]. This should take about [DisplayTimeText(pry_lid_timer)].")) + if(!tool.use_tool(src, user, pry_lid_timer)) // Pry speed must be affected by the speed of the tool. + return TRUE bust_open() user.visible_message( span_notice("[user] snaps the door of [src] wide open."), span_notice("The door of [src] snaps open.")) - return - . = ..() + return TRUE + return FALSE + +/obj/structure/closet/crate/coffin/wrench_act(mob/living/user, obj/item/tool) + if(anchored && resident) + to_chat(user, span_danger("The coffin won't come unanchored from the floor.[user == resident ? " You can Alt-Click to unclaim and unwrench your Coffin." : ""]")) + return TRUE + return ..() /// Distance Check (Inside Of) /obj/structure/closet/crate/coffin/AltClick(mob/user) diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm index d019b1f00538..485d15541dbb 100644 --- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm @@ -214,6 +214,7 @@ var/obj/item/organ/eyes/current_eyes = bloodsuckeruser.getorganslot(ORGAN_SLOT_EYES) if(current_eyes) current_eyes.flash_protect = max(initial(current_eyes.flash_protect) - 1, - 1) + current_eyes.color_cutoffs = list(25, 8, 5) current_eyes.sight_flags = SEE_MOBS current_eyes.setOrganDamage(0) //making sure diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 22df726a912f..deb16d442031 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -340,7 +340,11 @@ prof.name_list[slot] = I.name prof.appearance_list[slot] = I.appearance prof.flags_cover_list[slot] = I.flags_cover - prof.item_state_list[slot] = I.item_state + prof.inhand_icon_state_list[slot] = I.item_state + prof.lefthand_file_list[slot] = I.lefthand_file + prof.righthand_file_list[slot] = I.righthand_file + prof.worn_icon_list[slot] = I.mob_overlay_icon + prof.worn_icon_state_list[slot] = I.worn_icon_state prof.exists_list[slot] = 1 else continue @@ -624,12 +628,24 @@ var/protected = 0 var/datum/dna/dna = null - var/list/name_list = list() //associative list of slotname = itemname + /// Assoc list of item slot to item name - stores the name of every item of this profile. + var/list/name_list = list() + /// Assoc list of item slot to apperance - stores the appearance of every item of this profile. var/list/appearance_list = list() + /// Assoc list of item slot to flag - stores the flags_cover of every item of this profile. var/list/flags_cover_list = list() + /// Assoc list of item slot to boolean - stores whether an item in that slot exists var/list/exists_list = list() - var/list/item_color_list = list() - var/list/item_state_list = list() + /// Assoc list of item slot to file - stores the lefthand file of the item in that slot + var/list/lefthand_file_list = list() + /// Assoc list of item slot to file - stores the righthand file of the item in that slot + var/list/righthand_file_list = list() + /// Assoc list of item slot to file - stores the inhand file of the item in that slot + var/list/inhand_icon_state_list = list() + /// Assoc list of item slot to file - stores the worn icon file of the item in that slot + var/list/worn_icon_list = list() + /// Assoc list of item slot to string - stores the worn icon state of the item in that slot + var/list/worn_icon_state_list = list() var/underwear var/undershirt @@ -643,23 +659,24 @@ LAZYCLEARLIST(stored_scars) . = ..() -/datum/changelingprofile/proc/copy_profile(datum/changelingprofile/newprofile) - newprofile.name = name - newprofile.protected = protected - newprofile.dna = new dna.type - dna.copy_dna(newprofile.dna) - newprofile.name_list = name_list.Copy() - newprofile.appearance_list = appearance_list.Copy() - newprofile.flags_cover_list = flags_cover_list.Copy() - newprofile.exists_list = exists_list.Copy() - newprofile.item_color_list = item_color_list.Copy() - newprofile.item_state_list = item_state_list.Copy() - newprofile.underwear = underwear - newprofile.undershirt = undershirt - newprofile.socks = socks - newprofile.accent = accent - newprofile.stored_scars = stored_scars.Copy() - +/datum/changelingprofile/proc/copy_profile(datum/changelingprofile/new_profile) + new_profile.name = name + new_profile.protected = protected + new_profile.dna = new dna.type() + dna.copy_dna(new_profile.dna) + new_profile.name_list = name_list.Copy() + new_profile.appearance_list = appearance_list.Copy() + new_profile.flags_cover_list = flags_cover_list.Copy() + new_profile.exists_list = exists_list.Copy() + new_profile.lefthand_file_list = lefthand_file_list.Copy() + new_profile.righthand_file_list = righthand_file_list.Copy() + new_profile.inhand_icon_state_list = inhand_icon_state_list.Copy() + new_profile.underwear = underwear + new_profile.undershirt = undershirt + new_profile.socks = socks + new_profile.worn_icon_list = worn_icon_list.Copy() + new_profile.worn_icon_state_list = worn_icon_state_list.Copy() + new_profile.stored_scars = stored_scars.Copy() /datum/antagonist/changeling/xenobio name = "Xenobio Changeling" diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index b9c483b75021..58fa73d292c2 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -13,6 +13,14 @@ var/resist_string = "glows blinding white" //string for when a null rod blocks its effects, "glows [resist_string]" var/check_antimagic = TRUE +/obj/effect/clockwork/sigil/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + + /obj/effect/clockwork/sigil/attackby(obj/item/I, mob/living/user, params) if(I.force) if(is_servant_of_ratvar(user) && user.a_intent != INTENT_HARM) @@ -39,8 +47,7 @@ visible_message(span_warning("[src] scatters into thousands of particles.")) qdel(src) -/obj/effect/clockwork/sigil/Crossed(atom/movable/AM) - ..() +/obj/effect/clockwork/sigil/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM)) var/mob/living/L = AM if(L.stat <= stat_affected) diff --git a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm index c62f49b7f838..21d39600a10b 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/fabrication_helpers.dm @@ -239,7 +239,7 @@ if(!do_after(user, repair_values["healing_for_cycle"] * fabricator.speed_multiplier, src, \ extra_checks = CALLBACK(fabricator, TYPE_PROC_REF(/obj/item/clockwork/replica_fabricator, fabricator_repair_checks), repair_values, src, user, TRUE))) break - obj_integrity = clamp(obj_integrity + repair_values["healing_for_cycle"], 0, max_integrity) + update_integrity(clamp(atom_integrity + repair_values["healing_for_cycle"], 0, max_integrity)) adjust_clockwork_power(-repair_values["power_required"]) playsound(src, 'sound/machines/click.ogg', 50, 1) @@ -247,7 +247,7 @@ fabricator.repairing = null if(user) user.visible_message(span_notice("[user]'s [fabricator.name] stops covering [src] with glowing orange energy."), \ - span_alloy("You finish repairing [src]. It is now at [obj_integrity]/[max_integrity] integrity.")) + span_alloy("You finish repairing [src]. It is now at [atom_integrity]/[max_integrity] integrity.")) //Fabricator mob heal proc, to avoid as much copypaste as possible. /mob/living/proc/fabricator_heal(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm index 7c654e2a3fcf..b95d491e07da 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/battlehammer.dm @@ -12,6 +12,7 @@ /obj/item/clockwork/weapon/brass_battlehammer/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, require_twohands = TRUE) + AddComponent(/datum/component/cleave_attack, arc_size=180, requires_wielded=TRUE, no_multi_hit=TRUE) // big hammer /obj/item/clockwork/weapon/brass_battlehammer/attack(mob/living/target, mob/living/carbon/human/user) . = ..() diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm index 1d71903ac051..0bd2c2bb853d 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/longsword.dm @@ -12,6 +12,10 @@ var/emp_cooldown = 0 var/cooldown_duration = 10 SECONDS +/obj/item/clockwork/weapon/brass_sword/Initialize(mapload, new_action) + . = ..() + AddComponent(/datum/component/cleave_attack) // slice and dice in the name of ratvar + /obj/item/clockwork/weapon/brass_sword/attack(mob/living/target, mob/living/carbon/human/user) . = ..() if(world.time > emp_cooldown && !is_servant_of_ratvar(target)) @@ -22,7 +26,7 @@ new /obj/effect/temp_visual/emp/pulse(target.loc) playsound(user, 'sound/magic/lightningshock.ogg', 40) -/obj/item/clockwork/weapon/brass_sword/attack_obj(obj/O, mob/living/user) +/obj/item/clockwork/weapon/brass_sword/attack_atom(obj/O, mob/living/user) . = ..() if(world.time > emp_cooldown && ismecha(O)) O.emp_act(emp_severity * 2) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index 3e3b8fd0e8b7..17e27dcfabf1 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -107,7 +107,7 @@ update_quickbind(user) /obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file) - . = list() + . = ..() if(isinhands && item_state && inhand_overlay) var/mutable_appearance/M = mutable_appearance(icon_file, "slab_[inhand_overlay]") . += M diff --git a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm index e7bdf3a6adca..e53849325931 100644 --- a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm +++ b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm @@ -204,11 +204,11 @@ to_chat(user, span_warning("[C] cannot be repaired!")) return FALSE var/obj/O = target - if(O.obj_integrity >= O.max_integrity) + if(O.get_integrity() >= O.max_integrity) if(!silent) to_chat(user, span_warning("[O] is at maximum integrity!")) return FALSE - repair_values["amount_to_heal"] = O.max_integrity - O.obj_integrity + repair_values["amount_to_heal"] = O.max_integrity - O.get_integrity() else return FALSE if(repair_values["amount_to_heal"] <= 0) //nothing to heal! diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm index 8ed7296d9442..5b8dbd8ea563 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm @@ -139,7 +139,7 @@ var/obj/structure/destructible/clockwork/powered/P = A if(!can_access_clockwork_power(P)) commands += "Power This Structure" - if(P.obj_integrity < P.max_integrity) + if(P.get_integrity() < P.max_integrity) commands += "Repair This Structure" var/roma_invicta = input(src, "Choose a command to issue to your cult!", "Issue Commands") as null|anything in commands if(!roma_invicta) @@ -282,6 +282,6 @@ /datum/action/innate/eminence/mass_recall/Activate() var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar if(G && !G.recalling && G.recalls_remaining) - if(alert(owner, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(owner) || QDELETED(G) || !G.obj_integrity) + if(alert(owner, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(owner) || QDELETED(G) || !G.get_integrity()) return G.initiate_mass_recall() diff --git a/code/modules/antagonists/clockcult/clock_structure.dm b/code/modules/antagonists/clockcult/clock_structure.dm index b4d71902b183..655d02bfd620 100644 --- a/code/modules/antagonists/clockcult/clock_structure.dm +++ b/code/modules/antagonists/clockcult/clock_structure.dm @@ -30,7 +30,7 @@ /obj/structure/destructible/clockwork/ratvar_act() if(GLOB.ratvar_awakens || GLOB.clockwork_gateway_activated) - obj_integrity = max_integrity + update_integrity(max_integrity) /obj/structure/destructible/clockwork/narsie_act() if(take_damage(rand(25, 50), BRUTE) && src) //if we still exist @@ -45,20 +45,12 @@ desc = clockwork_desc . = ..() desc = initial(desc) + if(is_servant_of_ratvar(user) || isobserver(user)) + var/heavily_damaged = (atom_integrity < max_integrity * 0.5) + . += "[p_they(TRUE)] [p_are()] at [atom_integrity]/[max_integrity] integrity[heavily_damaged ? "!":"."]" if(unanchored_icon) . += span_notice("[src] is [anchored ? "":"not "]secured to the floor.") -/obj/structure/destructible/clockwork/examine_status(mob/user) - if(is_servant_of_ratvar(user) || isobserver(user)) - var/t_It = p_they(TRUE) - var/t_is = p_are() - var/heavily_damaged = FALSE - var/healthpercent = (obj_integrity/max_integrity) * 100 - if(healthpercent < 50) - heavily_damaged = TRUE - return "[t_It] [t_is] at [obj_integrity]/[max_integrity] integrity[heavily_damaged ? "!":"."]" - return ..() - /obj/structure/destructible/clockwork/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) if(is_servant_of_ratvar(user) && immune_to_servant_attacks) return FALSE @@ -72,7 +64,7 @@ return FALSE return ..() -/obj/structure/destructible/clockwork/mech_melee_attack(obj/mecha/M, equip_allowed) +/obj/structure/destructible/clockwork/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) if(M.occupant && is_servant_of_ratvar(M.occupant) && immune_to_servant_attacks) return FALSE return ..() @@ -80,7 +72,7 @@ /obj/structure/destructible/clockwork/proc/get_efficiency_mod() if(GLOB.ratvar_awakens) return 2 - . = max(sqrt(obj_integrity/max(max_integrity, 1)), 0.5) + . = max(sqrt(atom_integrity/max(max_integrity, 1)), 0.5) . = round(., 0.01) /obj/structure/destructible/clockwork/attack_ai(mob/user) @@ -122,7 +114,7 @@ return if(anchored && unanchored_icon) anchored = FALSE - update_anchored(null, obj_integrity > max_integrity * 0.25) + update_anchored(null, atom_integrity > max_integrity * 0.25) new /obj/effect/temp_visual/emp(loc) diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justiciar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justiciar.dm index cca95290a006..61205b7effcb 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justiciar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justiciar.dm @@ -94,7 +94,7 @@ @!$, [text2ratvar("PURGE ALL UNTRUTHS")] <&. the anomalies and destroy their source to prevent further damage to corporate property. This is \ not a drill.[grace_period ? " Estimated time of appearance: [grace_period] seconds. Use this time to prepare for an attack on [station_name()]." : ""]", \ "Central Command Higher Dimensional Affairs", 'sound/magic/clockwork/ark_activation.ogg') - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) for(var/V in SSticker.mode.servants_of_ratvar) var/datum/mind/M = V if(!M || !M.current) @@ -212,7 +212,7 @@ glow.linked = src /obj/structure/destructible/clockwork/massive/celestial_gateway/ex_act(severity) - var/damage = max((obj_integrity * 0.7) / severity, 100) //requires multiple bombs to take down + var/damage = max((atom_integrity * 0.7) / severity, 100) //requires multiple bombs to take down take_damage(damage, BRUTE, BOMB, 0) /obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_time(deciseconds = TRUE) @@ -231,7 +231,7 @@ if(grace_period) return "[get_arrival_time()][s_on_time ? "S" : ""]" . = "IMMINENT" - if(!obj_integrity) + if(!atom_integrity) . = "DETONATING" else if(GATEWAY_RATVAR_ARRIVAL - progress_in_seconds > 0) . = "[round(max((GATEWAY_RATVAR_ARRIVAL - progress_in_seconds) / (GATEWAY_SUMMON_RATE), 0), 1)][s_on_time ? "S":""]" @@ -291,7 +291,7 @@ to_chat(M, span_warning("You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]...")) else to_chat(M, span_boldwarning("You hear otherworldly sounds from all around you...")) - if(!obj_integrity) + if(!atom_integrity) return for(var/turf/closed/wall/W in RANGE_TURFS(2, src)) W.dismantle_wall() @@ -335,7 +335,7 @@ glow.icon_state = "clockwork_gateway_closing" if(GATEWAY_RATVAR_ARRIVAL to INFINITY) if(!purpose_fulfilled) - set_security_level(SEC_LEVEL_DELTA) + SSsecurity_level.set_level(SEC_LEVEL_DELTA) countdown.stop() resistance_flags |= INDESTRUCTIBLE purpose_fulfilled = TRUE @@ -388,7 +388,7 @@ if(!recalls_remaining) to_chat(user, span_warning("The Ark can no longer recall!")) return - if(alert(user, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(src) || QDELETED(user) || !obj_integrity) + if(alert(user, "Initiate mass recall?", "Mass Recall", "Yes", "No") != "Yes" || QDELETED(src) || QDELETED(user) || !atom_integrity) return initiate_mass_recall() //wHOOPS LOOKS LIKE A HULK GOT THROUGH diff --git a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm index aa74ab72091b..23a7dc2db2df 100644 --- a/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm +++ b/code/modules/antagonists/clockcult/clock_structures/heralds_beacon.dm @@ -97,7 +97,7 @@ /obj/structure/destructible/clockwork/heralds_beacon/proc/herald_the_justiciar() priority_announce("A powerful group of fanatical zealots following the cause of Ratvar have brazenly sacrificed stealth for power, and dare anyone \ to try and stop them.", title = "The Justiciar Comes", sound = 'sound/magic/clockwork/ark_activation.ogg') - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) GLOB.ratvar_approaches = TRUE available = FALSE STOP_PROCESSING(SSprocessing, src) diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm index 33ee2c0c225a..cac4d584bf5b 100644 --- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm @@ -15,8 +15,14 @@ T.wired_to += src to_chat(usr, span_alloy("[src] automatically links with [T] beneath it.")) -/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/Crossed(atom/movable/AM) +/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/Initialize(mapload) . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM) && !is_servant_of_ratvar(AM)) var/mob/living/L = AM if(L.stat || L.m_intent == MOVE_INTENT_WALK || !(L.mobility_flags & MOBILITY_STAND)) diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index 2595970056b2..ffa678fe171f 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -50,6 +50,9 @@ if(density) return var/mob/living/squirrel = locate() in get_turf(src) + playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE) + density = TRUE //Skewers are one-use only + update_appearance(UPDATE_DESC|UPDATE_ICON_STATE) if(squirrel) if(iscyborg(squirrel)) if(!squirrel.stat) @@ -57,7 +60,8 @@ span_userdanger("A massive brass spike rips through your chassis and bursts into shrapnel in your casing!")) squirrel.adjustBruteLoss(50) squirrel.Stun(4 SECONDS) - addtimer(CALLBACK(src, PROC_REF(take_damage), max_integrity), 1) + atom_destruction() + return else squirrel.visible_message(span_boldwarning("A massive brass spike erupts from the ground, impaling [squirrel]!"), \ span_userdanger("A massive brass spike rams through your chest, hoisting you into the air!")) @@ -69,10 +73,16 @@ buckle_mob(squirrel, TRUE) else visible_message(span_danger("A massive brass spike erupts from the ground!")) - playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE) - icon_state = "[initial(icon_state)]_extended" - density = TRUE //Skewers are one-use only - desc = "A vicious brass spike protruding from the ground like a stala[pick("gm", "ct")]ite. It makes you sick to look at." //is stalagmite the ground one? or the ceiling one? who can ever remember? + +/obj/structure/destructible/clockwork/trap/brass_skewer/update_icon_state() + . = ..() + if(density) + icon_state = "[initial(icon_state)]_extended" + +/obj/structure/destructible/clockwork/trap/brass_skewer/update_desc(updates) + . = ..() + if(density) + desc = "A vicious brass spike protruding from the ground like a stala[pick("gm", "ct")]ite. It makes you sick to look at." //is stalagmite the ground one? or the ceiling one? who can ever remember? /obj/structure/destructible/clockwork/trap/brass_skewer/user_buckle_mob() return diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm index 28a068596ca2..9ad30c7ef297 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/steam_vent.dm @@ -8,6 +8,13 @@ max_integrity = 100 density = FALSE +/obj/structure/destructible/clockwork/trap/steam_vent/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/structure/destructible/clockwork/trap/steam_vent/activate() opacity = !opacity icon_state = "steam_vent_[opacity]" @@ -17,8 +24,7 @@ else playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) -/obj/structure/destructible/clockwork/trap/steam_vent/Crossed(atom/movable/AM) - . = ..() +/obj/structure/destructible/clockwork/trap/steam_vent/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM) && opacity) var/mob/living/L = AM L.adjust_wet_stacks(1) //It's wet! diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a9dfd38d2af9..75a15cc47dd4 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -446,7 +446,7 @@ holder.update_inv_wear_suit() /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands) - . = list() + . = ..() if(!isinhands && shielded) . += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01) @@ -487,7 +487,7 @@ user.dropItemToGround(src, TRUE) /obj/item/clothing/glasses/hud/health/night/cultblind - desc = "may Nar'sie guide you through the darkness and shield you from the light." + desc = "May Nar'sie guide you through the darkness and shield you from the light." name = "zealot's blindfold" icon_state = "blindfold" item_state = "blindfold" @@ -534,7 +534,7 @@ GLOBAL_VAR_INIT(curselimit, 0) if(SSshuttle.emergency.mode == SHUTTLE_CALL) var/cursetime = 1800 var/timer = SSshuttle.emergency.timeLeft(1) + cursetime - var/security_num = seclevel2num(get_security_level()) + var/security_num = SSsecurity_level.get_current_level_as_number() var/set_coefficient = 1 switch(security_num) if(SEC_LEVEL_GREEN) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 519f16e4b613..060f01c30610 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -32,26 +32,21 @@ /obj/structure/destructible/cult/examine(mob/user) . = ..() . += span_notice("\The [src] is [anchored ? "":"not "]secured to the floor.") - if((iscultist(user) || isobserver(user)) && cooldowntime > world.time) - . += "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)]." - -/obj/structure/destructible/cult/examine_status(mob/user) if(iscultist(user) || isobserver(user)) - var/t_It = p_they(TRUE) - var/t_is = p_are() - return span_cult("[t_It] [t_is] at [round(obj_integrity * 100 / max_integrity)]% stability.") - return ..() + . += span_cult("[p_they(TRUE)] [p_are()] at [round(atom_integrity * 100 / max_integrity)]% stability.") + if(cooldowntime > world.time) + . += "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)]." /obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M) if(is_endgame && iscultist(M)) return FALSE //no smash or healing if(istype(M, /mob/living/simple_animal/hostile/construct/builder)) - if(obj_integrity < max_integrity) + if(atom_integrity < max_integrity) M.changeNext_move(CLICK_CD_MELEE) - obj_integrity = min(max_integrity, obj_integrity + 5) + update_integrity(min(max_integrity, atom_integrity + 5)) Beam(M, icon_state="sendbeam", time=4) M.visible_message(span_danger("[M] repairs \the [src]."), \ - span_cult("You repair [src], leaving [p_they()] at [round(obj_integrity * 100 / max_integrity)]% stability.")) + span_cult("You repair [src], leaving [p_they()] at [round(atom_integrity * 100 / max_integrity)]% stability.")) else to_chat(M, span_cult("You cannot repair [src], as [p_theyre()] undamaged!")) else @@ -278,7 +273,6 @@ icon_state = "pillar-enter" icon = 'icons/obj/cult_64x64.dmi' pixel_x = -16 - obj_integrity = 200 max_integrity = 200 break_sound = 'sound/effects/meteorimpact.ogg' break_message = span_warning("The pillar crumbles!") @@ -315,9 +309,9 @@ /obj/structure/destructible/cult/pillar/update_icon_state() . = ..() icon_state = "pillar[alt ? "alt": ""]2" - if (obj_integrity < max_integrity/3) + if (atom_integrity < max_integrity/3) icon_state = "pillar[alt ? "alt": ""]0" - else if (obj_integrity < 2*max_integrity/3) + else if (atom_integrity < 2*max_integrity/3) icon_state = "pillar[alt ? "alt": ""]1" /obj/structure/destructible/cult/pillar/conceal() @@ -338,7 +332,6 @@ icon_state = "bloodstone-enter1" icon = 'icons/obj/cult_64x64.dmi' pixel_x = -16 - obj_integrity = 600 max_integrity = 600 break_sound = 'sound/effects/glassbr2.ogg' break_message = span_warning("The bloodstone resonates violently before crumbling to the floor!") @@ -442,10 +435,8 @@ SSticker.mode.cult_loss_bloodstones() ..() -/obj/structure/destructible/cult/bloodstone/mech_melee_attack(obj/mecha/M, equip_allowed) //Remind me to redo this jank-ass calculation - M.force = round(M.force/6, 1) //damage is reduced since mechs deal triple damage to objects, this sets gygaxes to 15 (5*3) damage and durands to 21 (7*3) damage - . = ..() - M.force = initial(M.force) +/obj/structure/destructible/cult/bloodstone/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) //you're welcome, mqiib + return ..(M, punch_force / 6, equip_allowed) //damage is reduced since mechs deal triple damage to objects, this sets gygaxes to 15 (5*3) damage and durands to 21 (7*3) damage /obj/structure/destructible/cult/bloodstone/hulk_damage() return 15 //no @@ -480,9 +471,9 @@ var/image/I_base = image('icons/obj/cult_64x64.dmi',"bloodstone-base") I_base.appearance_flags |= RESET_COLOR//we don't want the stone to pulse overlays += I_base - if (obj_integrity <= max_integrity/3) + if (atom_integrity <= max_integrity/3) . += "bloodstone_damage2" - else if (obj_integrity <= 2*max_integrity/3) + else if (atom_integrity <= 2*max_integrity/3) . += "bloodstone_damage1" set_light(3+current_fullness, 2+current_fullness) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 3211bcddc427..992d93ecd221 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -17,7 +17,7 @@ Runes can either be invoked by one's self or with many different cultists. Each name = "rune" var/cultist_name = "basic rune" desc = "A rune vandalizing the station." - var/cultist_desc = "a basic rune with no function." //This is shown to cultists who examine the rune in order to determine its true purpose. + var/cultist_desc = "A basic rune with no function." //This is shown to cultists who examine the rune in order to determine its true purpose. anchored = TRUE icon = 'icons/obj/rune.dmi' icon_state = "1" @@ -193,7 +193,7 @@ structure_check() searches for nearby cultist structures required for the invoca //Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user. /obj/effect/rune/malformed cultist_name = "malformed rune" - cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this." + cultist_desc = "A senseless rune written in gibberish. No good can come from invoking this." invocation = "Ra'sha yoka!" invoke_damage = 30 @@ -209,7 +209,7 @@ structure_check() searches for nearby cultist structures required for the invoca //Rite of Offering: Converts or sacrifices a target. /obj/effect/rune/convert cultist_name = "Offer" - cultist_desc = "offers a noncultist above it to Nar'sie, either converting them or sacrificing them." + cultist_desc = "Offers a non-cultist above it to Nar'sie, either converting them or sacrificing them." req_cultists_text = "2 for conversion, 3 for living sacrifices and sacrifice targets." invocation = "Mah'weyh pleggh at e'ntrath!" icon_state = "3" @@ -361,7 +361,7 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/empower cultist_name = "Empower" - cultist_desc = "allows cultists to prepare greater amounts of blood magic at far less of a cost." + cultist_desc = "Allows cultists to prepare greater amounts of blood magic at far less of a cost." invocation = "H'drak v'loso, mir'kanas verbot!" icon_state = "3" color = RUNE_COLOR_TALISMAN @@ -375,7 +375,7 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/teleport cultist_name = "Teleport" - cultist_desc = "warps everything above it to another chosen teleport rune." + cultist_desc = "Warps everything above it to another chosen teleport rune." invocation = "Sas'so c'arta forbici!" icon_state = "2" color = RUNE_COLOR_TELEPORT @@ -498,7 +498,7 @@ structure_check() searches for nearby cultist structures required for the invoca //Ritual of Dimensional Rending: Calls forth the avatar of Nar'sie upon the station. /obj/effect/rune/narsie cultist_name = "Nar'sie" - cultist_desc = "tears apart dimensional barriers, beginning the Red Harvest. You will need to protect 4 Bloodstones around the station, then the Anchor Bloodstone after invoking this rune or the summoning will backfire and need to be restarted. Requires 9 invokers, with the cult leader counting as half of this if they invoke the rune." + cultist_desc = "Tears apart dimensional barriers, beginning the Red Harvest. You will need to protect 4 Bloodstones around the station, then the Anchor Bloodstone after invoking this rune or the summoning will backfire and need to be restarted. Requires 9 invokers, with the cult leader counting as half of this if they invoke the rune." invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!" req_cultists = 9 req_cultists_text = "9 cultists, with the cult leader counting as 5 if they are the invoker" @@ -589,7 +589,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) //Rite of Resurrection: Requires a dead or inactive cultist. When reviving the dead, you can only perform one revival for every three sacrifices your cult has carried out. /obj/effect/rune/raise_dead cultist_name = "Revive" - cultist_desc = "requires a dead, mindless, or inactive cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be given a new life. This will cause large amounts of damage to the invoker and the revived corpse." + cultist_desc = "Requires a dead, mindless, or inactive cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be given a new life. This will cause large amounts of damage to the invoker and the revived corpse." invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below icon_state = "1" color = RUNE_COLOR_MEDIUMRED @@ -683,7 +683,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) //Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo. /obj/effect/rune/wall cultist_name = "Barrier" - cultist_desc = "when invoked, makes a temporary invisible wall to block passage. Can be invoked again to reverse this." + cultist_desc = "When invoked, makes a temporary invisible wall to block passage. Can be invoked again to reverse this." invocation = "Khari'd! Eske'te tannin!" icon_state = "4" color = RUNE_COLOR_DARKRED @@ -764,7 +764,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) //Rite of Joined Souls: Summons a single cultist. /obj/effect/rune/summon cultist_name = "Summon Cultist" - cultist_desc = "summons a single cultist to the rune. Requires 2 invokers." + cultist_desc = "Summons a single cultist to the rune. Requires 2 invokers." invocation = "N'ath reth sh'yro eth d'rekkathnor!" req_cultists = 2 invoke_damage = 10 @@ -822,7 +822,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) //Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby /obj/effect/rune/blood_boil cultist_name = "Boil Blood" - cultist_desc = "boils the blood of non-believers who can see the rune, rapidly dealing extreme amounts of damage. Requires 3 invokers." + cultist_desc = "Boils the blood of non-believers who can see the rune, rapidly dealing extreme amounts of damage. Requires 3 invokers." invocation = "Dedo ol'btoh!" icon_state = "4" color = RUNE_COLOR_BURNTORANGE @@ -887,7 +887,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) //Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost. /obj/effect/rune/manifest cultist_name = "Spirit Realm" - cultist_desc = "manifests a spirit servant of the Geometer and allows you to ascend as a spirit yourself. The invoker must not move from atop the rune, and will take damage for each summoned spirit." + cultist_desc = "Manifests a spirit servant of the Geometer and allows you to ascend as a spirit yourself. The invoker must not move from atop the rune, and will take damage for each summoned spirit." invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this icon_state = "7" invoke_damage = 10 @@ -1014,7 +1014,7 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0) /obj/effect/rune/apocalypse cultist_name = "Apocalypse" - cultist_desc = "a harbinger of the end times. Grows in strength with the cult's desperation - but at the risk of... side effects." + cultist_desc = "A harbinger of the end times. Grows in strength with the cult's desperation - but at the risk of... side effects." invocation = "Ta'gh fara'qha fel d'amar det!" icon = 'icons/effects/96x96.dmi' icon_state = "apoc" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm index fe61fff7a4af..e4fcadb3e30f 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm @@ -3,7 +3,7 @@ desc = "A book with a peculiar lock on it, there's no keyhole." icon = 'icons/obj/eldritch.dmi' icon_state = "book" - //worn_icon_state = "book" + worn_icon_state = "book" w_class = WEIGHT_CLASS_SMALL ///Last person that touched this var/mob/living/last_user diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm index e3ae58f0497d..40c530c1efed 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm @@ -419,7 +419,7 @@ /obj/effect/penance_giver name = "code ing" - desc = "it takes your soul, and other stuff" + desc = "It takes your soul, and other stuff." icon = 'icons/mob/triangle.dmi' icon_state = "triangle" light_power = 2 diff --git a/code/modules/antagonists/eldritch_cult/eldritch_transmutations.dm b/code/modules/antagonists/eldritch_cult/eldritch_transmutations.dm index 90bbe651339e..4fdfca5b5a59 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_transmutations.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_transmutations.dm @@ -141,7 +141,7 @@ /datum/eldritch_transmutation/final/on_finished_recipe(mob/living/user, list/atoms, loc) var/atom/movable/gravity_lens/shockwave = new(get_turf(user)) - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) shockwave.transform = matrix().Scale(0.5) shockwave.pixel_x = -240 diff --git a/code/modules/antagonists/eldritch_cult/transmutations/cosmo_transmutations.dm b/code/modules/antagonists/eldritch_cult/transmutations/cosmo_transmutations.dm index 59fdf9e67798..8fc9e3a599b8 100644 --- a/code/modules/antagonists/eldritch_cult/transmutations/cosmo_transmutations.dm +++ b/code/modules/antagonists/eldritch_cult/transmutations/cosmo_transmutations.dm @@ -52,7 +52,7 @@ qdel(spells) priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the cosmos, for The Creator has ascended! Unmake all of reality! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", ANNOUNCER_SPANOMALIES) var/atom/movable/gravity_lens/shockwave = new(get_turf(user)) - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) shockwave.transform = matrix().Scale(0.5) shockwave.pixel_x = -240 diff --git a/code/modules/antagonists/eldritch_cult/transmutations/flesh_transmutations.dm b/code/modules/antagonists/eldritch_cult/transmutations/flesh_transmutations.dm index 404f5c6245a2..3258303ce55c 100644 --- a/code/modules/antagonists/eldritch_cult/transmutations/flesh_transmutations.dm +++ b/code/modules/antagonists/eldritch_cult/transmutations/flesh_transmutations.dm @@ -134,7 +134,7 @@ spells.Remove(user) qdel(spells) priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the dark, for King of Arms has ascended! Our Lord of the Night has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", ANNOUNCER_SPANOMALIES) - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) var/atom/movable/gravity_lens/shockwave = new(get_turf(user)) shockwave.transform = matrix().Scale(0.5) diff --git a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm index 4e720c328ab2..3d541999432e 100644 --- a/code/modules/antagonists/nukeop/equipment/borgchameleon.dm +++ b/code/modules/antagonists/nukeop/equipment/borgchameleon.dm @@ -15,7 +15,7 @@ var/activationUpkeep = 50 var/mob/listeningTo var/static/list/signalCache = list( // list here all signals that should break the camouflage - COMSIG_PARENT_ATTACKBY, + COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ATOM_BULLET_ACT, diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index fe42d23f5607..3dbe930042bc 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) return priority_announce(war_declaration, title = "Declaration of War", sound = 'sound/machines/alarm.ogg', has_important_message = TRUE) - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.") diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 71f316318918..e0d48477184b 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -40,7 +40,7 @@ STOP_PROCESSING(SSobj, core) update_appearance(UPDATE_ICON) GLOB.poi_list |= src - previous_level = get_security_level() + previous_level = SSsecurity_level.get_current_level_as_text() /obj/machinery/nuclearbomb/Destroy() safety = FALSE @@ -387,7 +387,7 @@ safety = !safety if(safety) if(timing) - set_security_level(previous_level) + SSsecurity_level.set_level(previous_level) for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(initial(S.mode)) S.alert = FALSE @@ -402,15 +402,15 @@ return timing = !timing if(timing) - previous_level = get_security_level() + previous_level = SSsecurity_level.get_current_level_as_text() detonation_timer = world.time + (timer_set * 10) for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(TRACK_INFILTRATOR) countdown.start() - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) else detonation_timer = null - set_security_level(previous_level) + SSsecurity_level.set_level(previous_level) for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(initial(S.mode)) S.alert = FALSE @@ -544,7 +544,7 @@ detonation_timer = null exploding = FALSE exploded = TRUE - set_security_level(previous_level) + SSsecurity_level.set_level(previous_level) for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(initial(S.mode)) S.alert = FALSE diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 51de65512872..508c4611361f 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -206,6 +206,8 @@ return FALSE if(!can_be_owned(candidate.mind)) return FALSE + if(is_synth(candidate)) + return FALSE var/mob/living/carbon/C = candidate //Check to see if the potential rev is implanted if(!istype(C)) //Can't convert simple animals return FALSE diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm index 044372255569..bbe2b1991b27 100644 --- a/code/modules/antagonists/space_dragon/carp_rift.dm +++ b/code/modules/antagonists/space_dragon/carp_rift.dm @@ -172,7 +172,7 @@ charge_state = CHARGE_COMPLETED var/area/A = get_area(src) priority_announce("Spatial object has reached peak energy charge in [initial(A.name)], please stand-by.", "Central Command Wildlife Observations") - obj_integrity = INFINITY + update_integrity(INFINITY) icon_state = "carp_rift_charged" set_light_color(LIGHT_COLOR_YELLOW) update_light() diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 661f10255f92..43cf5f048c65 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -62,6 +62,9 @@ if(traitor_kind == TRAITOR_AI && owner.current && isAI(owner.current)) var/mob/living/silicon/ai/A = owner.current A.set_zeroth_law("") + for(var/datum/action/innate/ai/ranged/cameragun/ai_action in A.actions) + if(ai_action.from_traitor) + ai_action.Remove(A) if(malf) remove_verb(A, /mob/living/silicon/ai/proc/choose_modules) A.malf_picker.remove_malf_verbs(A) @@ -159,10 +162,12 @@ if(minorObjective) add_objective(minorObjective) if(!(locate(/datum/objective/escape) in objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - add_objective(escape_objective) - return + if(prob(70)) //doesn't always need to escape + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + add_objective(escape_objective) + else + forge_single_human_objective() /datum/antagonist/traitor/proc/forge_ai_objectives() var/objective_count = 0 @@ -195,13 +200,8 @@ destroy_objective.owner = owner destroy_objective.find_target() add_objective(destroy_objective) - else if(prob(20)) - var/datum/objective/maroon_organ/organ_objective = new - organ_objective.owner = owner - organ_objective.finalize() - add_objective(organ_objective) else - var/N = pick(/datum/objective/assassinate/cloned, /datum/objective/assassinate/once, /datum/objective/assassinate, /datum/objective/maroon) + var/N = pick(/datum/objective/assassinate/cloned, /datum/objective/assassinate/once, /datum/objective/assassinate, /datum/objective/maroon, /datum/objective/maroon_organ) var/datum/objective/kill_objective = new N kill_objective.owner = owner kill_objective.find_target() @@ -261,6 +261,16 @@ add_law_zero() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE) owner.current.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MALF) + + var/has_action = FALSE + for(var/datum/action/innate/ai/ranged/cameragun/ai_action in owner.current.actions) + has_action = TRUE + break + if(!has_action) + var/datum/action/innate/ai/ranged/cameragun/ability = new + ability.from_traitor = TRUE + ability.Grant(owner.current) + if(TRAITOR_HUMAN) if(should_equip) equip(silent) diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index c820bc437c2a..f58690164490 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -232,7 +232,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module)) if(owner.stat == DEAD) return priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", ANNOUNCER_AIMALF) - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) var/obj/machinery/doomsday_device/DOOM = new(owner_AI) owner_AI.nuking = TRUE owner_AI.doomsday_device = DOOM @@ -325,7 +325,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/AI_Module)) /datum/AI_Module/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) for(var/obj/machinery/porta_turret/ai/turret in GLOB.machines) - turret.obj_integrity += 30 + turret.modify_max_integrity(turret.max_integrity + 30, FALSE) turret.lethal_projectile = /obj/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR. turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' diff --git a/code/modules/antagonists/traitor/equipment/contractor.dm b/code/modules/antagonists/traitor/equipment/contractor.dm index 504398313736..32dfae8e0e9a 100644 --- a/code/modules/antagonists/traitor/equipment/contractor.dm +++ b/code/modules/antagonists/traitor/equipment/contractor.dm @@ -183,8 +183,8 @@ uniform = /obj/item/clothing/under/chameleon suit = /obj/item/clothing/suit/chameleon - back = /obj/item/storage/backpack - belt = /obj/item/pda/chameleon + back = /obj/item/storage/backpack/chameleon + belt = /obj/item/modular_computer/tablet/pda/preset/syndicate mask = /obj/item/clothing/mask/cigarette/syndicate shoes = /obj/item/clothing/shoes/chameleon/noslip ears = /obj/item/radio/headset/chameleon diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm index e56821fc7e33..11759185cce9 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm @@ -5,6 +5,13 @@ spell_type = /datum/action/cooldown/spell/pointed/projectile/fireball category = "Offensive" +/datum/spellbook_entry/cast_iron + name = "Cast Iron" + desc = "Fires a blunt force projectile." + spell_type = /datum/action/cooldown/spell/pointed/projectile/cast_iron + category = "Offensive" + cost = 1 + /datum/spellbook_entry/spell_cards name = "Spell Cards" desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" @@ -17,6 +24,12 @@ spell_type = /datum/action/cooldown/spell/rod_form category = "Offensive" +/datum/spellbook_entry/scrunch + name = "Scrunch" + desc = "Scrunches a target." + spell_type = /datum/action/cooldown/spell/pointed/scrunch + category = "Offensive" + /datum/spellbook_entry/disintegrate name = "Smite" desc = "Charges your hand with an unholy energy that can be used to cause a touched victim to violently explode." diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index 22399760526a..4188543ddc8d 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -147,6 +147,9 @@ desc = "An evil-looking remote controller for a crematorium." /obj/item/assembly/control/crematorium/activate() + if(is_synth(usr)) + to_chat(usr, span_warning("You don't want to use this!")) + return if(cooldown) return cooldown = TRUE diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 2ac8f3b83d8d..43f1627d76ed 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -117,6 +117,8 @@ return typecache_filter_list(target_loc.get_all_contents(), GLOB.typecache_living) /obj/item/assembly/flash/proc/try_use_flash(mob/user = null) + if(user && !synth_check(user, SYNTH_RESTRICTED_ITEM)) + return if(user && HAS_TRAIT(user, TRAIT_NO_STUN_WEAPONS)) to_chat(user, span_warning("You can't seem to remember how this works!")) return FALSE @@ -294,6 +296,8 @@ addtimer(CALLBACK(src, PROC_REF(cooldown)), flashcd * 2) /obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) + if(user && !synth_check(user, SYNTH_RESTRICTED_ITEM)) + return if(user && HAS_TRAIT(user, TRAIT_NO_STUN_WEAPONS)) to_chat(user, span_warning("You can't seem to remember how this works!")) return FALSE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index cdb02b9dfb0e..6bcf042db889 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -219,8 +219,14 @@ pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE|LETPASSTHROW var/obj/item/assembly/infra/master -/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) +/obj/effect/beam/i_beam/Initialize(mapload) . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/beam/i_beam/proc/on_entered(datum/source, atom/movable/AM, ...) if(istype(AM, /obj/effect/beam)) return if (isitem(AM)) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index cd2eb6972683..75f8fd51ee9c 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -9,6 +9,13 @@ var/armed = FALSE +/obj/item/assembly/mousetrap/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(trap_stepped_on), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/item/assembly/mousetrap/examine(mob/user) . = ..() . += span_notice("The pressure plate is [armed?"primed":"safe"].") @@ -109,7 +116,7 @@ return ..() -/obj/item/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) +/obj/item/assembly/mousetrap/proc/trap_stepped_on(datum/source, atom/movable/AM, ...) if(armed) if(ismob(AM)) var/mob/MM = AM @@ -124,7 +131,7 @@ triggered(MM) else if(AM.density) // For mousetrap grenades, set off by anything heavy triggered(AM) - ..() + return /obj/item/assembly/mousetrap/on_found(mob/finder) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index db7012ed1b87..bf3283b59083 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -170,6 +170,7 @@ "coding.png" = 'html/coding.png', "ban.png" = 'html/ban.png', "chrome-wrench.png" = 'html/chrome-wrench.png', + "mapping.png" = 'html/mapping.png', "changelog.css" = 'html/changelog.css' ) parents = list("changelog.html" = 'html/changelog.html') @@ -367,6 +368,14 @@ if (machine) item = machine + // Check for GAGS support where necessary + var/greyscale_config = initial(item.greyscale_config) + var/greyscale_colors = initial(item.greyscale_colors) + if (greyscale_config && greyscale_colors) + icon_file = SSgreyscale.GetColoredIconByType(greyscale_config, greyscale_colors) + else + icon_file = initial(item.icon) + icon_file = initial(item.icon) icon_state = initial(item.icon_state) #ifdef UNIT_TESTS @@ -398,7 +407,11 @@ if (!ispath(item, /atom)) continue - var/icon_file = initial(item.icon) + var/icon_file + if (initial(item.greyscale_colors) && initial(item.greyscale_config)) + icon_file = SSgreyscale.GetColoredIconByType(initial(item.greyscale_config), initial(item.greyscale_colors)) + else + icon_file = initial(item.icon) var/icon_state = initial(item.icon_state) if(ispath(item, /obj/item/ammo_box)) var/obj/item/ammo_box/ammoitem = item @@ -651,3 +664,59 @@ glow = "pod_glow_[glow]" podIcon.Blend(icon(icon_file, glow), ICON_OVERLAY) Insert("pod_asset[style]", podIcon) + +/datum/asset/spritesheet/rcd + name = "rcd-tgui" + +/datum/asset/spritesheet/rcd/create_spritesheets() + //We load airlock icons seperatly from other icons cause they need overlays + + //load all category essential icon_states. format is icon_file = list of icon states we need from that file + var/list/essentials = list( + 'icons/mob/radial.dmi' = list("wallfloor", "delete", "dirwindow", "fullwindow", "dirwindow_r", "fullwindow_r", "cnorth", "csouth", "ceast", "cwest", "chair", "stool", "windoor", "secure_windoor"), + 'icons/obj/recycling.dmi' = list("conveyor_construct", "switch-off"), + 'icons/obj/structures.dmi' = list("window0", "rwindow0", "table", "glass_table"), + 'icons/obj/stock_parts.dmi' = list("box_1"), + ) + + var/icon/icon + for(var/icon_file as anything in essentials) + for(var/icon_state as anything in essentials[icon_file]) + icon = icon(icon = icon_file, icon_state = icon_state) + Insert(sanitize_css_class_name(icon_state), icon) + + //for each airlock type we create its overlayed version with the suffix Glass in the sprite name + var/list/airlocks = list( + "Standard" = 'icons/obj/doors/airlocks/station/public.dmi', + "Public" = 'icons/obj/doors/airlocks/station2/glass.dmi', + "Engineering" = 'icons/obj/doors/airlocks/station/engineering.dmi', + "Atmospherics" = 'icons/obj/doors/airlocks/station/atmos.dmi', + "Security" = 'icons/obj/doors/airlocks/station/security.dmi', + "Command" = 'icons/obj/doors/airlocks/station/command.dmi', + "Medical" = 'icons/obj/doors/airlocks/station/medical.dmi', + "Research" = 'icons/obj/doors/airlocks/station/research.dmi', + "Freezer" = 'icons/obj/doors/airlocks/station/freezer.dmi', + "Virology" = 'icons/obj/doors/airlocks/station/virology.dmi', + "Mining" = 'icons/obj/doors/airlocks/station/mining.dmi', + "Maintenance" = 'icons/obj/doors/airlocks/station/maintenance.dmi', + "External" = 'icons/obj/doors/airlocks/external/external.dmi', + "External Maintenance" = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi', + "Airtight Hatch" = 'icons/obj/doors/airlocks/hatch/centcom.dmi', + "Maintenance Hatch" = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' + ) + //these 3 types dont have glass doors + var/list/exclusion = list("Freezer", "Airtight Hatch", "Maintenance Hatch") + + for(var/airlock_name in airlocks) + //solid door with overlay + icon = icon(icon = airlocks[airlock_name] , icon_state = "closed" , dir = SOUTH) + icon.Blend(icon(icon = airlocks[airlock_name], icon_state = "fill_closed", dir = SOUTH), ICON_OVERLAY) + Insert(sanitize_css_class_name(airlock_name), icon) + + //exclude these glass types + if(airlock_name in exclusion) + continue + + //glass door no overlay + icon = icon(airlocks[airlock_name] , "closed" , SOUTH) + Insert(sanitize_css_class_name("[airlock_name]Glass"), icon) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index f0e24ee776a6..17400aacd2ee 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -316,9 +316,6 @@ return fusion_react(air, holder) /proc/fusion_react(datum/gas_mixture/air, datum/holder) - var/turf/open/location = get_holder_turf(holder) - if(!location) - return NO_REACTION if(!air.analyzer_results) air.analyzer_results = new var/list/cached_scan_results = air.analyzer_results @@ -366,6 +363,7 @@ air.adjust_moles(GAS_NITRIUM, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)) if(reaction_energy) + var/turf/open/location = get_holder_turf(holder) if(location) var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up. if(prob(PERCENT(particle_chance))) @@ -429,7 +427,7 @@ GAS_PLASMA = 10, ) -/datum/gas_reaction/bzformation/react(datum/gas_mixture/air) +/datum/gas_reaction/bzformation/react(datum/gas_mixture/air, datum/holder) var/pressure = air.return_pressure() var/old_thermal_energy = air.thermal_energy() @@ -448,7 +446,9 @@ air.adjust_moles(GAS_PLASMA, -2*reaction_efficency) //clamps by a minimum amount in the event of an underflow. - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, clamp((reaction_efficency**2)*BZ_RESEARCH_AMOUNT,0.01,BZ_RESEARCH_MAX_AMOUNT)) + var/turf/holder_turf = get_holder_turf(holder) + if(holder_turf && SSmapping.level_trait(holder_turf.z, ZTRAIT_STATION)) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, clamp((reaction_efficency**2)*BZ_RESEARCH_AMOUNT,0.01,BZ_RESEARCH_MAX_AMOUNT)) if(energy_released > 0) var/new_heat_capacity = air.heat_capacity() @@ -467,7 +467,7 @@ GAS_TRITIUM = 10, "TEMP" = 5000000) -/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air) +/datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air, datum/holder) var/initial_trit = air.get_moles(GAS_TRITIUM) var/initial_n2 = air.get_moles(GAS_N2) var/initial_bz = air.get_moles(GAS_BZ) @@ -480,7 +480,11 @@ air.adjust_moles(GAS_TRITIUM, -10*nob_formed) air.adjust_moles(GAS_N2, -20*nob_formed) air.adjust_moles(GAS_HYPERNOB, nob_formed) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, clamp(nob_formed*NOBLIUM_RESEARCH_AMOUNT, 0.01, NOBLIUM_RESEARCH_MAX_AMOUNT)) + + var/turf/holder_turf = get_holder_turf(holder) + if(holder_turf && SSmapping.level_trait(holder_turf.z, ZTRAIT_STATION)) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, clamp(nob_formed*NOBLIUM_RESEARCH_AMOUNT, 0.01, NOBLIUM_RESEARCH_MAX_AMOUNT)) + var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY) air.set_temperature(max(((old_thermal_energy - energy_taken)/new_heat_capacity),TCMB)) @@ -510,7 +514,10 @@ //Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable air.set_temperature(air.return_temperature() + cleaned_air * 0.002) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, clamp(cleaned_air*MIASMA_RESEARCH_AMOUNT,0.01, MIASMA_RESEARCH_MAX_AMOUNT))//Turns out the burning of miasma is kinda interesting to scientists + + var/turf/holder_turf = get_holder_turf(holder) + if(holder_turf && SSmapping.level_trait(holder_turf.z, ZTRAIT_STATION)) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, clamp(cleaned_air*MIASMA_RESEARCH_AMOUNT,0.01, MIASMA_RESEARCH_MAX_AMOUNT))//Turns out the burning of miasma is kinda interesting to scientists return REACTING /datum/gas_reaction/nitro_ball @@ -730,7 +737,9 @@ if (prob(25 * increase_factor)) air.adjust_moles(GAS_H2, -(heat_efficency * 10)) new /obj/item/stack/sheet/mineral/metal_hydrogen(location) - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((heat_efficency * increase_factor * 0.5), METAL_HYDROGEN_RESEARCH_MAX_AMOUNT)) + var/turf/holder_turf = get_holder_turf(holder) + if(holder_turf && SSmapping.level_trait(holder_turf.z, ZTRAIT_STATION)) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((heat_efficency * increase_factor * 0.5), METAL_HYDROGEN_RESEARCH_MAX_AMOUNT)) if(energy_used > 0) var/new_heat_capacity = air.heat_capacity() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index fb56c2c87412..0a482b4d1c3e 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -855,6 +855,18 @@ return ..() +/obj/machinery/airalarm/attack_ai(mob/user) + if(!isAI(user)) + return ..() + + var/mob/living/silicon/ai/AI = user + if(AI.has_subcontroller_connection(get_area(src))) + return ..() + + to_chat(AI, span_warning("No connection to subcontroller detected. Polling APC...")) + if(do_after(AI, 1 SECONDS, src, IGNORE_USER_LOC_CHANGE)) + return ..() + /obj/machinery/airalarm/AltClick(mob/user) ..() if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) @@ -902,7 +914,7 @@ new /obj/item/stack/sheet/metal(loc, 2) var/obj/item/I = new /obj/item/electronics/airalarm(loc) if(!disassembled) - I.obj_integrity = I.max_integrity * 0.5 + I.update_integrity(I.max_integrity * 0.5) new /obj/item/stack/cable_coil(loc, 3) qdel(src) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 5dfa7e7d23b1..63cf55779af0 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -230,6 +230,11 @@ GLOBAL_LIST_EMPTY(pipeimages) if(!can_unwrench(user)) return ..() + //var/turf/T = get_turf(src) + /*if (level==1 && isturf(T) && T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) + to_chat(user, span_warning("You must remove the plating first!")) + return TRUE*/ + var/datum/gas_mixture/int_air = return_air() var/datum/gas_mixture/env_air = loc.return_air() add_fingerprint(user) @@ -302,7 +307,7 @@ GLOBAL_LIST_EMPTY(pipeimages) var/obj/item/pipe/stored = new construction_type(loc, null, dir, src) stored.set_piping_layer(piping_layer) if(!disassembled) - stored.obj_integrity = stored.max_integrity * 0.5 + stored.update_integrity(stored.max_integrity * 0.5) transfer_fingerprints_to(stored) ..() @@ -340,6 +345,8 @@ GLOBAL_LIST_EMPTY(pipeimages) add_atom_colour(obj_color, FIXED_COLOUR_PRIORITY) pipe_color = obj_color set_piping_layer(set_layer) + //var/turf/T = get_turf(src) + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) atmos_init() var/list/nodes = pipeline_expansion() for(var/obj/machinery/atmospherics/A in nodes) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index bb83be1d2ad2..831b8bc80acc 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -273,7 +273,7 @@ playsound(src, 'sound/items/change_drill.ogg', 50) update_icon_nopipes() -/obj/machinery/atmospherics/components/binary/circulator/obj_break(damage_flag) +/obj/machinery/atmospherics/components/binary/circulator/atom_break(damage_flag) if(generator) generator.kill_circs() generator.update_appearance(UPDATE_ICON) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm index f9dd6525ecfb..3dfbc7007446 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_fuel_datums.dm @@ -125,6 +125,20 @@ GLOBAL_LIST_INIT(hfr_fuels_list, hfr_fuels_create_list()) secondary_products = list(GAS_ANTINOB, GAS_HEALIUM, GAS_PLUONIUM, GAS_ZAUKER, GAS_NITRIUM, GAS_MIASMA) meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_BIG_SPREAD +/datum/hfr_fuel/pluox_antinob_fuel + id = "pluox_antinob_fuel" + name = "Pluoxium + Antinoblium fuel" + negative_temperature_multiplier = 0.1 + positive_temperature_multiplier = 2.7 + energy_concentration_multiplier = 1.5 + fuel_consumption_multiplier = 0.05 + gas_production_multiplier = 2 + temperature_change_multiplier = 0.97 + requirements = list(GAS_PLUOXIUM, GAS_ANTINOB) + primary_products = list(GAS_HYPERNOB, GAS_MIASMA) + secondary_products = list(GAS_HALON, GAS_HEXANE, GAS_BZ, GAS_NITRIUM, GAS_HEALIUM, GAS_ZAUKER) + meltdown_flags = HYPERTORUS_FLAG_DEVASTATING_EXPLOSION | HYPERTORUS_FLAG_RADIATION_PULSE | HYPERTORUS_FLAG_EMP | HYPERTORUS_FLAG_MASSIVE_SPREAD + /datum/hfr_fuel/hypernob_antinob_fuel id = "hypernob_antinob_fuel" name = "Hypernoblium + Antinoblium fuel" diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm index 700b970fb1d6..c7889588cd2c 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -251,10 +251,11 @@ var/remove_amount = round(min(fuel_list[gas_id], fuel_consumption), 0.01) internal_fusion.adjust_moles(gas_id, -remove_amount) delta_fuel_list[gas_id] -= remove_amount + + var/add_remove_amount = round(scaled_production, 0.01) // gases on the same tier are produced at normal rate for(var/gas_id in fuel.primary_products) - var/add_amount = round(fuel_consumption * 0.5, 0.01) - internal_fusion.adjust_moles(gas_id, add_amount) - delta_fuel_list[gas_id] += add_amount + internal_fusion.adjust_moles(gas_id, add_remove_amount) + delta_fuel_list[gas_id] += add_remove_amount if(power_level < 1) return // can't produce any gases, don't need to continue @@ -262,8 +263,8 @@ // Each recipe provides a tier list of six output gases. // Which gases are produced depend on what the fusion level is. var/list/tier = fuel.secondary_products - moderator_internal.adjust_moles(tier[power_level], round(scaled_production, 0.01)) // gases on the same tier are produced at normal rate - delta_mod_list[tier[power_level]] += round(scaled_production, 0.01) + moderator_internal.adjust_moles(tier[power_level], add_remove_amount) + delta_mod_list[tier[power_level]] += add_remove_amount if(power_level < 6) moderator_internal.adjust_moles(tier[power_level + 1], round(scaled_production * 0.5, 0.01)) // gases on the above tier are produced at reduced rate delta_mod_list[tier[power_level + 1]] += round(scaled_production * 0.5, 0.01) @@ -303,7 +304,7 @@ heat_output *= 1.025 var/remove_amount = round(min(moderator_internal.get_moles(GAS_PLUONIUM), scaled_production * 1.35), 0.01) moderator_internal.adjust_moles(GAS_PLUONIUM, -remove_amount) - delta_mod_list[GAS_PLUONIUM] += remove_amount + delta_mod_list[GAS_PLUONIUM] -= remove_amount if(3, 4) if(moderator_list[GAS_PLASMA] > 10) @@ -347,7 +348,7 @@ linked_output.airs[1].adjust_moles(GAS_FREON, scaled_production * 1.15) induce_hallucination(500, delta_time) if(moderator_list[GAS_HEALIUM] > 100) - if(critical_threshold_proximity > 400) + if(critical_threshold_proximity > 90) critical_threshold_proximity = max(critical_threshold_proximity - (moderator_list[GAS_HEALIUM] / 100 * delta_time ), 0) var/remove_amount = round(min(moderator_internal.get_moles(GAS_HEALIUM), scaled_production * 20), 0.01) moderator_internal.adjust_moles(GAS_HEALIUM, -remove_amount) @@ -373,7 +374,7 @@ induce_hallucination(900, delta_time, force=TRUE) linked_output.airs[1].adjust_moles(GAS_ANTINOB, clamp(dirty_production_rate / 0.045, 0, 10) * delta_time) if(moderator_list[GAS_HEALIUM] > 100) - if(critical_threshold_proximity > 400) + if(critical_threshold_proximity > 90) critical_threshold_proximity = max(critical_threshold_proximity - (moderator_list[GAS_HEALIUM] / 100 * delta_time), 0) var/remove_amount = round(min(moderator_internal.get_moles(GAS_HEALIUM), scaled_production * 20), 0.01) delta_mod_list[GAS_HEALIUM] -= remove_amount diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index de6de198bf09..ad9e2229e583 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -1,7 +1,8 @@ #define AIR_CONTENTS ((25*ONE_ATMOSPHERE)*(air_contents.return_volume())/(R_IDEAL_GAS_EQUATION*air_contents.return_temperature())) + /obj/machinery/atmospherics/components/unary/tank - icon = 'icons/obj/atmospherics/pipes/pressure_tank.dmi' - icon_state = "generic" + icon = 'icons/obj/atmospherics/stationary_canisters.dmi' + icon_state = "smooth" name = "pressure tank" desc = "A large vessel containing pressurized gas." @@ -11,6 +12,9 @@ layer = ABOVE_WINDOW_LAYER pipe_flags = PIPING_ONE_PER_TURF + greyscale_config = /datum/greyscale_config/stationary_canister + greyscale_colors = "#ffffff" + var/volume = 10000 //in liters var/gas_type = 0 @@ -25,7 +29,7 @@ set_piping_layer(piping_layer) /obj/machinery/atmospherics/components/unary/tank/air - icon_state = "grey" + greyscale_colors = "#c6c0b5" name = "pressure tank (Air)" /obj/machinery/atmospherics/components/unary/tank/air/Initialize(mapload) @@ -43,7 +47,7 @@ air_contents.set_moles(GAS_CO2, AIR_CONTENTS) /obj/machinery/atmospherics/components/unary/tank/toxins - icon_state = "orange" + greyscale_colors = "#f62800" gas_type = GAS_PLASMA /obj/machinery/atmospherics/components/unary/tank/toxins/Initialize(mapload) @@ -52,7 +56,7 @@ air_contents.set_moles(GAS_PLASMA, AIR_CONTENTS) /obj/machinery/atmospherics/components/unary/tank/oxygen - icon_state = "blue" + greyscale_colors = "#2786E5" gas_type = GAS_O2 /obj/machinery/atmospherics/components/unary/tank/oxygen/Initialize(mapload) @@ -61,7 +65,7 @@ air_contents.set_moles(GAS_O2, AIR_CONTENTS) /obj/machinery/atmospherics/components/unary/tank/nitrogen - icon_state = "red" + greyscale_colors = "#d41010" gas_type = GAS_N2 /obj/machinery/atmospherics/components/unary/tank/nitrogen/Initialize(mapload) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 677e7c334a30..6ac20aa51b30 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -105,6 +105,8 @@ /obj/machinery/atmospherics/pipe/layer_manifold/atmos_init() normalize_cardinal_directions() findAllConnections() + //var/turf/T = loc // hide if turf is not intact + //hide(T.underfloor_accessibility < UNDERFLOOR_VISIBLE) /obj/machinery/atmospherics/pipe/layer_manifold/set_piping_layer() piping_layer = PIPING_LAYER_DEFAULT diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 893ed307ddc2..36b2542b0fea 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -117,7 +117,7 @@ /obj/machinery/atmospherics/pipe/return_pipenets() . = list(parent) -/obj/machinery/atmospherics/pipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/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 . = ..() diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 42abcc19fd6f..465d21af09be 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -3,8 +3,10 @@ /obj/machinery/portable_atmospherics/canister name = "canister" desc = "A canister for the storage of gas." - icon = 'icons/obj/atmospherics/canister.dmi' - icon_state = "hazard" + icon = 'icons/obj/atmospherics/canisters.dmi' + icon_state = "#mapme" + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#ffff00#000000" density = TRUE var/valve_open = FALSE var/obj/machinery/atmospherics/components/binary/passive_gate/pump @@ -34,17 +36,14 @@ var/restricted = FALSE req_access = list() + var/icon/canister_overlay_file = 'icons/obj/atmospherics/canisters.dmi' + //list of canister types for relabeling var/static/list/label2types = list( - "generic" = /obj/machinery/portable_atmospherics/canister/generic, - "generic striped" = /obj/machinery/portable_atmospherics/canister/generic/stripe, - "generic hazard" = /obj/machinery/portable_atmospherics/canister/generic/hazard, - "caution" = /obj/machinery/portable_atmospherics/canister, - "danger" = /obj/machinery/portable_atmospherics/canister/fusion_test, "n2" = /obj/machinery/portable_atmospherics/canister/nitrogen, "o2" = /obj/machinery/portable_atmospherics/canister/oxygen, "co2" = /obj/machinery/portable_atmospherics/canister/carbon_dioxide, - "plasma" = /obj/machinery/portable_atmospherics/canister/toxins, + "plasma" = /obj/machinery/portable_atmospherics/canister/plasma, "n2o" = /obj/machinery/portable_atmospherics/canister/nitrous_oxide, "nitrium" = /obj/machinery/portable_atmospherics/canister/nitrium, "bz" = /obj/machinery/portable_atmospherics/canister/bz, @@ -72,153 +71,167 @@ return ..() -/obj/machinery/portable_atmospherics/canister/generic - icon_state = "generic" - -/obj/machinery/portable_atmospherics/canister/generic/stripe - icon_state = "generic-stripe" - -/obj/machinery/portable_atmospherics/canister/generic/hazard - icon_state = "generic-hazard" - /obj/machinery/portable_atmospherics/canister/nitrogen name = "Nitrogen canister" desc = "Nitrogen gas. Reportedly useful for something." - icon_state = "nitrogen" + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#1b6d1b" gas_type = GAS_N2 /obj/machinery/portable_atmospherics/canister/oxygen name = "Oxygen canister" desc = "Oxygen. Necessary for human life." - icon_state = "oxygen" + greyscale_config = /datum/greyscale_config/canister/stripe + greyscale_colors = "#2786e5#e8fefe" gas_type = GAS_O2 /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "Carbon dioxide canister" desc = "Carbon dioxide. What the fuck is carbon dioxide?" - icon_state = "carbon" + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#4e4c48" gas_type = GAS_CO2 -/obj/machinery/portable_atmospherics/canister/toxins +/obj/machinery/portable_atmospherics/canister/plasma name = "Plasma canister" desc = "Plasma gas. The reason YOU are here. Highly toxic." - icon_state = "plasma" + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#f62800#000000" gas_type = GAS_PLASMA /obj/machinery/portable_atmospherics/canister/bz name = "\improper BZ canister" desc = "BZ, a powerful hallucinogenic nerve agent." - icon_state = "bz" + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#f62800#d0d2a0" gas_type = GAS_BZ /obj/machinery/portable_atmospherics/canister/nitrous_oxide name = "Nitrous oxide canister" desc = "Nitrous oxide gas. Known to cause drowsiness." - icon_state = "nitrous" + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#1b6d1b#f7d5d3" gas_type = GAS_NITROUS /obj/machinery/portable_atmospherics/canister/air name = "Air canister" desc = "Pre-mixed air." - icon_state = "air" + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#c6c0b5" /obj/machinery/portable_atmospherics/canister/tritium name = "Tritium canister" desc = "Tritium. Inhalation might cause irradiation." - icon_state = "tritium" + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#d41010#000000" gas_type = GAS_TRITIUM /obj/machinery/portable_atmospherics/canister/nob name = "Hyper-noblium canister" desc = "Hyper-Noblium. More noble than all other gases." - icon_state = "hypno" + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#6399fc#b2b2b2" gas_type = GAS_HYPERNOB /obj/machinery/portable_atmospherics/canister/nitrium name = "Nitrium canister" desc = "Nitrium gas. Feels great 'til the acid eats your lungs." - icon_state = "nitrium" + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#7b4732" gas_type = GAS_NITRIUM /obj/machinery/portable_atmospherics/canister/pluoxium name = "Pluoxium canister" desc = "Pluoxium. Like oxygen, but more bang for your buck." - icon_state = "pluoxium" + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#2786e5#000000" gas_type = GAS_PLUOXIUM /obj/machinery/portable_atmospherics/canister/water_vapor name = "Water vapor canister" desc = "Water vapor. We get it, you vape." - icon_state = "water" + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#2ee5e9#f7d5d3" gas_type = GAS_H2O filled = 1 /obj/machinery/portable_atmospherics/canister/miasma name = "Miasma canister" desc = "Foul miasma. Even the canister reeks of fetid refuse." - icon_state = "miasma" + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#d35ecb#943233" gas_type = GAS_MIASMA filled = 1 /obj/machinery/portable_atmospherics/canister/dilithium name = "Dilithium canister" desc = "A gas produced from dilithium crystal." - icon_state = "dilithium" + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#ff83c0#f7d5d3" gas_type = GAS_DILITHIUM /obj/machinery/portable_atmospherics/canister/freon name = "Freon canister" - desc = "Freon. Can absorb heat" - icon_state = "freon" + desc = "Freon. Can absorb heat." + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#68d7ef#ffffff" gas_type = GAS_FREON filled = 1 /obj/machinery/portable_atmospherics/canister/hydrogen name = "Hydrogen canister" - desc = "Hydrogen, highly flammable" - icon_state = "h2" + desc = "Hydrogen, highly flammable." + greyscale_config = /datum/greyscale_config/canister/stripe + greyscale_colors = "#d41010#ffffff" gas_type = GAS_H2 filled = 1 /obj/machinery/portable_atmospherics/canister/healium name = "Healium canister" - desc = "Healium, causes deep sleep" - icon_state = "healium" + desc = "Healium, causes deep sleep." + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#009823#ff0e00" gas_type = GAS_HEALIUM filled = 1 /obj/machinery/portable_atmospherics/canister/pluonium name = "Pluonium canister" - desc = "Pluonium, reacts differently with various gases" - icon_state = "pluonium" + desc = "Pluonium, reacts differently with various gases." + greyscale_config = /datum/greyscale_config/canister + greyscale_colors = "#2786e5" gas_type = GAS_PLUONIUM filled = 1 /obj/machinery/portable_atmospherics/canister/halon name = "Halon canister" - desc = "Halon, remove oxygen from high temperature fires and cool down the area" - icon_state = "halon" + desc = "Halon, remove oxygen from high temperature fires and cool down the area." + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#9b5d7f#368bff" gas_type = GAS_HALON filled = 1 /obj/machinery/portable_atmospherics/canister/hexane name = "Hexane canister" - desc = "hexane, highly flammable." - icon_state = "hexane" + desc = "Hexane, highly flammable, what a shame." + + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#9b608b#fd89fd" gas_type = GAS_HEXANE filled = 1 /obj/machinery/portable_atmospherics/canister/zauker name = "Zauker canister" desc = "Zauker, highly toxic" - icon_state = "zauker" + greyscale_config = /datum/greyscale_config/canister/double_stripe + greyscale_colors = "#009a00#006600" gas_type = GAS_ZAUKER filled = 1 /obj/machinery/portable_atmospherics/canister/antinoblium name = "Antinoblium canister" - desc = "Antinoblium, we still don't know what it does, but it sells for a lot" - icon_state = "antino" + desc = "Antinoblium, we still don't know what it does, but it sells for a lot." + greyscale_config = /datum/greyscale_config/canister/hazard + greyscale_colors = "#000000#790000" gas_type = GAS_ANTINOB filled = 1 @@ -236,8 +249,8 @@ /obj/machinery/portable_atmospherics/canister/proto name = "prototype canister" - icon = 'icons/obj/atmos.dmi' - icon_state = "proto" + greyscale_config = /datum/greyscale_config/prototype_canister + greyscale_colors = "#ffffff#a50021#ffffff" /obj/machinery/portable_atmospherics/canister/proto/default name = "prototype canister" @@ -297,25 +310,21 @@ air_contents.set_moles(GAS_O2, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) air_contents.set_moles(GAS_N2, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) -/obj/machinery/portable_atmospherics/canister/update_icon_state() - if(stat & BROKEN) - icon_state = "[initial(icon_state)]-1" - return ..() - /obj/machinery/portable_atmospherics/canister/update_overlays() . = ..() if(stat & BROKEN) + . += mutable_appearance(canister_overlay_file, "broken") return if(valve_open) - . += "can-open" + . += mutable_appearance(canister_overlay_file, "can-open") if(holding) - . += "can-tank" + . += mutable_appearance(canister_overlay_file, "can-tank") if(connected_port) - . += "can-connector" + . += mutable_appearance(canister_overlay_file, "can-connector") var/light_state = get_pressure_state(air_contents?.return_pressure()) if(light_state) //happens when pressure is below 10kpa which means no light - . += mutable_appearance(icon, light_state) + . += mutable_appearance(canister_overlay_file, light_state) ///return the icon_state component for the canister's indicator light based on its current pressure reading /obj/machinery/portable_atmospherics/canister/proc/get_pressure_state(air_pressure) @@ -368,7 +377,7 @@ return TRUE -/obj/machinery/portable_atmospherics/canister/obj_break(damage_flag) +/obj/machinery/portable_atmospherics/canister/atom_break(damage_flag) . = ..() if(!.) return @@ -380,7 +389,7 @@ var/turf/T = get_turf(src) T.assume_air(expelled_gas) - obj_break() + atom_break() density = FALSE playsound(src.loc, 'sound/effects/spray.ogg', 10, TRUE, -3) investigate_log("was destroyed.", INVESTIGATE_ATMOS) @@ -389,6 +398,8 @@ usr.put_in_hands(holding) holding = null + animate(src, 0.5 SECONDS, transform=turn(transform, 90), easing=BOUNCE_EASING) + /obj/machinery/portable_atmospherics/canister/replace_tank(mob/living/user, close_valve) . = ..() if(.) @@ -468,14 +479,18 @@ return switch(action) if("relabel") - var/label = input("New canister label:", name) as null|anything in label2types - if(label && !..()) - var/newtype = label2types[label] + var/label = tgui_input_list(usr, "New canister label", "Canister", label2types) + if(isnull(label)) + return + if(!..()) + var/newtype = label2types[label] if(newtype) var/obj/machinery/portable_atmospherics/canister/replacement = newtype + investigate_log("was relabelled to [initial(replacement.name)] by [key_name(usr)].", INVESTIGATE_ATMOS) name = initial(replacement.name) desc = initial(replacement.desc) icon_state = initial(replacement.icon_state) + set_greyscale(initial(replacement.greyscale_colors), initial(replacement.greyscale_config)) if("restricted") restricted = !restricted if(restricted) @@ -566,6 +581,12 @@ analyzer_act(user, src) return ..() +/obj/machinery/portable_atmospherics/canister/fusion + name = "Fusion Canister" + desc = "A violent mix of gases resulting in a fusion reaction inside the canister.
\ + A note on the side reads: \"DANGER: DO NOT OPEN\"" + icon_state = "danger" + /* yog- ADMEME CANISTERS */ /// Canister 1 Kelvin below the fusion point. Is highly unoptimal, do not spawn to start fusion, only good for testing low instability mixes. @@ -573,12 +594,13 @@ name = "Fusion Test Canister" desc = "This should never be spawned in game." icon_state = "danger" + /obj/machinery/portable_atmospherics/canister/fusion_test/create_gas() air_contents.set_moles(GAS_TRITIUM, 10) air_contents.set_moles(GAS_PLASMA, 500) - air_contents.set_moles(GAS_H2, 500) + air_contents.set_moles(GAS_CO2, 500) air_contents.set_moles(GAS_NITROUS, 100) - air_contents.set_temperature(10000) + air_contents.set_temperature(FUSION_TEMPERATURE_THRESHOLD) /// Canister 1 Kelvin below the fusion point. Contains far too much plasma. Only good for adding more fuel to ongoing fusion reactions. /obj/machinery/portable_atmospherics/canister/fusion_test_2 @@ -590,7 +612,7 @@ air_contents.set_moles(GAS_PLASMA, 15000) air_contents.set_moles(GAS_CO2, 1500) air_contents.set_moles(GAS_NITROUS, 100) - air_contents.set_temperature(9999) + air_contents.set_temperature(FUSION_TEMPERATURE_THRESHOLD - 1) /// Canister at the perfect conditions to start and continue fusion for a long time. /obj/machinery/portable_atmospherics/canister/fusion_test_3 @@ -614,7 +636,7 @@ air_contents.set_moles(GAS_PLASMA, 4500) air_contents.set_moles(GAS_CO2, 1500) air_contents.set_moles(GAS_DILITHIUM, 2000) - air_contents.set_temperature(10000) + air_contents.set_temperature(FUSION_TEMPERATURE_THRESHOLD - 1) /// A canister that is 1 Kelvin away from doing the stimball reaction. /obj/machinery/portable_atmospherics/canister/stimball_test diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 7f8d208ba54f..3315166f3d5a 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -266,7 +266,7 @@ /obj/machinery/capture_the_flag/proc/spawn_team_member(client/new_team_member) var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(src)) new_team_member.prefs.apply_prefs_to(M) - M.set_species(/datum/species/synth) + M.set_species(/datum/species/ipc/self) M.key = new_team_member.key M.faction += team M.equipOutfit(ctf_gear) @@ -345,7 +345,7 @@ continue if(isstructure(atm)) var/obj/structure/S = atm - S.obj_integrity = S.max_integrity + S.update_integrity(S.max_integrity) else if(!is_type_in_typecache(atm, ctf_object_typecache)) qdel(atm) @@ -605,10 +605,13 @@ /obj/effect/ctf/ammo/Initialize(mapload) ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) QDEL_IN(src, AMMO_DROP_LIFETIME) -/obj/effect/ctf/ammo/Crossed(atom/movable/AM) - . = ..() +/obj/effect/ctf/ammo/proc/on_entered(datum/source, atom/movable/AM, ...) reload(AM) /obj/effect/ctf/ammo/Bump(atom/A) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 76a5c6f96f65..e2c4329286f1 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -312,7 +312,7 @@ /obj/effect/mob_spawn/human/corpse/cargo_tech name = "Cargo Tech" - outfit = /datum/outfit/job/cargo_tech + outfit = /datum/outfit/job/cargo_tech/no_pda /obj/effect/mob_spawn/human/cook name = "Cook" diff --git a/code/modules/awaymissions/mission_code/netmin/_puzzles.dm b/code/modules/awaymissions/mission_code/netmin/_puzzles.dm new file mode 100644 index 000000000000..1aaf78135023 --- /dev/null +++ b/code/modules/awaymissions/mission_code/netmin/_puzzles.dm @@ -0,0 +1,184 @@ +GLOBAL_VAR_INIT(decrypted_puzzle_disks, 0) +GLOBAL_LIST_EMPTY(button_puzzles) +GLOBAL_LIST_EMPTY(rock_paper_scissors_puzzle_answers) + +/proc/rock_paper_scissors_puzzle() + var/player_list = GLOB.player_list.Copy() + + for(var/mob/unsorted_players in player_list) + if(unsorted_players.job == "Network Admin") + player_list -= unsorted_players + + var/players_to_ask = 3 + if(length(player_list) < players_to_ask) + players_to_ask = length(player_list) + + while(players_to_ask > 0) + var/mob/player = pick_n_take(player_list) + var/answer = tgui_input_list(player, "You've been selected for a quick game of rock-paper-scissors. Unfortunately we cannot tell you if you win.", "Rock Paper Scissors", list("Rock", "Paper", "Scissors")) + if(!answer) + GLOB.rock_paper_scissors_puzzle_answers += pick("Rock", "Paper", "Scissors") + else + GLOB.rock_paper_scissors_puzzle_answers += answer + players_to_ask-- + +/obj/item/disk/puzzle + name = "encrypted floppy drive" + desc = "Likely contains the access key to a locked door." + icon = 'icons/obj/card.dmi' + icon_state = "data_3" + item_state = "card-id" + lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' + var/decrypted = FALSE + var/id + var/decryption_progress = 0 + var/detail_color = COLOR_ASSEMBLY_BLUE + +/obj/item/disk/puzzle/examine(mob/user) + . = ..() + . += "The disk seems to be [decrypted ? "decrypted" : "encrypted"]." + +/obj/item/disk/puzzle/Initialize(mapload) + .=..() + update_icon() + +/obj/item/disk/puzzle/update_overlays() + . = ..() + if(detail_color == COLOR_FLOORTILE_GRAY) + return + var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color") + detail_overlay.color = detail_color + add_overlay(detail_overlay) + + +/datum/button_puzzle_holder + var/id + var/list/buttons = list() + var/list/doors = list() + var/list/papers = list() + var/index = 1 + + +/datum/button_puzzle_holder/New() + addtimer(CALLBACK(src, PROC_REF(generate_order)), 5 SECONDS) + +/datum/button_puzzle_holder/proc/generate_order() + shuffle_inplace(buttons) + + var/number = 1 + for(var/obj/item/paper/fluff/awaymissions/button_puzzle/paper in papers) + var/obj/machinery/button_puzzle/button = buttons[number] + paper.generate(number, button.name) + number++ + +/datum/button_puzzle_holder/proc/reset() + index = 1 + +/datum/button_puzzle_holder/proc/button_pressed(obj/machinery/button_puzzle/button) + if(index > buttons.len) + open_doors() + return + + if(buttons[index] == button) + index++ + else + reset() + + if(index > buttons.len) + open_doors() + return + +/datum/button_puzzle_holder/proc/open_doors() + for(var/obj/machinery/door/password/button_puzzle/door in doors) + door.open() + +/obj/item/paper/fluff/awaymissions/button_puzzle + name = "MEMORY DUMP" + info = "MEMORY DUMPED. CONTENTS:
49EA+g4cF" + var/id + +/obj/item/paper/fluff/awaymissions/button_puzzle/proc/generate(number, order) + info = "MEMORY DUMPED. CONTENTS:
49EA+[number] - [order]g4cF" + +/obj/item/paper/fluff/awaymissions/button_puzzle/Initialize(mapload) + . = ..() + var/found_datum = FALSE + for(var/datum/button_puzzle_holder/holder in GLOB.button_puzzles) + if(holder.id == id) + holder.papers += src + found_datum = TRUE + break + if(!found_datum) + var/datum/button_puzzle_holder/H = new() + H.id = id + H.papers += src + GLOB.button_puzzles += H + + +/obj/machinery/button_puzzle + name = "button" + desc = "A remote control switch." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "doorctrl" + var/skin = "doorctrl" + var/id = null + var/order + + var/datum/button_puzzle_holder/manager + + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/machinery/button_puzzle/Initialize(mapload) + . = ..() + + name = "[initial(name)] - [random_nukecode(4)]" + if(id) + var/found_datum = FALSE + for(var/datum/button_puzzle_holder/holder in GLOB.button_puzzles) + if(holder.id == id) + holder.buttons += src + manager = holder + found_datum = TRUE + break + + if(!found_datum) + var/datum/button_puzzle_holder/H = new() + H.id = id + H.buttons += src + manager = H + GLOB.button_puzzles += H + + +/obj/machinery/button_puzzle/update_icon_state() + . = ..() + if(panel_open) + icon_state = "button-open" + else + if(stat & (NOPOWER|BROKEN)) + icon_state = "[skin]-p" + else + icon_state = skin + + +/obj/machinery/button_puzzle/attackby(obj/item/W, mob/user, params) + if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON)) + return attack_hand(user) + else + return ..() + + +/obj/machinery/button_puzzle/attack_hand(mob/user) + . = ..() + if(.) + return + add_fingerprint(user) + play_click_sound("button") + + + use_power(5) + icon_state = "[skin]1" + + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/, update_icon)), 15) + manager.button_pressed(src) + diff --git a/code/modules/awaymissions/mission_code/netmin/abandoned_mine.dm b/code/modules/awaymissions/mission_code/netmin/abandoned_mine.dm new file mode 100644 index 000000000000..658f5df5354e --- /dev/null +++ b/code/modules/awaymissions/mission_code/netmin/abandoned_mine.dm @@ -0,0 +1,55 @@ +/area/awaymission/vr/abandoned_mine + name = "Abandoned Mine" + icon_state = "awaycontent5" + pacifist = FALSE + + +/obj/item/paper/pamphlet/away/safety_pamphlet + name = "safety instructions" + icon_state = "pamphlet" + info = {"Welcome aboard Mining Installation 13 - "Paradiso", the largest producer of high-quality iron in this sector!
We're glad to have you onboard, but before you can start work there's a few important safety instructions we have to inform you about:
+ 1. If you see any native lifeforms, avoid them and contact security
+ 2. Any missing tools assigned to you will be docked from your pay.
+ 3. See the sheet in the crew quarters for service prices.
+ 4. Due to our distance from the nearest law enforcement station our security staff have had their powers expanded.
+ 5. You're legally obligated to stay for the full duration of your contract.
+ 6. You're liable for any funeral costs you might incur.
+ 7. Do NOT, under any circumstance, enter the command centre without permission.
+ "} + + +/obj/item/paper/fluff/awaymissions/production_numbers + name = "production report" + info = {"Production Report
+ Last Sol cycle we exported 750.000 tons of iron ore, up 17% YoY.
+ Degrading the quality of food for the works has earned us a 7% decrease in operating costs.
+ Shipment destinations:
+ Space Station 13: 125.000 tons
+ REDACTED Facility: 500.000 tons
+ Central Command: 125.000 tons
+ "} + +/obj/item/paper/fluff/awaymissions/mine_robot_order + name = "requisition order" + info = {"Requisition Order
+ We hereby confirm your order of 75 Model 3 mining robots.
+ Upon their arrival we urge you to let the crew go.
+ There will be no room on the shuttle for passenger transport.
+ You know what you have to do.
+ "} + +/obj/item/paper/fluff/awaymissions/mine_contract + name = "work contract" + info = {"Employment Contract
+ Employee: William Young.
+ Installation: "Paradiso".
+ Pay: 500 credits per cycle.
+ Agreed upon contract duration: 3 solar cycles. (1 cycle = 45 Sol years)
+ You see a small note scribbled at the bottom:


+ Those BASTARDS! I agreed to sign up for 3 years, but those bean counters were measuring in LOCAL solar cycles!
+ I've talked to some of the others, and we're going to overthrow these tyrants!
+ "} + +/obj/item/paper/fluff/awaymissions/mine_coordinates + name = "coordinate readout" + info = {"Coordinates of REDACTED facility attached for supply purposes. Return to transmuter to upload coordinates and access further missions."} diff --git a/code/modules/awaymissions/mission_code/netmin/combat_robot_factory.dm b/code/modules/awaymissions/mission_code/netmin/combat_robot_factory.dm new file mode 100644 index 000000000000..dd59d5c8669c --- /dev/null +++ b/code/modules/awaymissions/mission_code/netmin/combat_robot_factory.dm @@ -0,0 +1,119 @@ +/area/awaymission/vr/combat_robot_factory + name = "Abandoned Robot Factory" + icon_state = "awaycontent4" + pacifist = FALSE + +/obj/item/paper/fluff/awaymissions/robot_factory/shipment_details + name = "Shipment Details" + info = "Shipment Details:
500x Agricultural Robots @ 1999.95 cr
200x Construction Robots @ 2499.95 cr

Total: 1,499,965 cr

Destination:
Gamnar Military Base" + +/obj/item/paper/fluff/awaymissions/robot_factory/advanced_model + name = "Personal Research" + info = "I've crunched the numbers on the capabilities of the servors in these robots. I'm pretty certain they could handle additional armor plating, and maybe even a more powerful gun. I'll tell the boss after I've finished my prototypes." + +/obj/item/paper/fluff/awaymissions/robot_factory/benny + name = "diary entry #631" + info = "I should really stop naming all my passwords after you, Benny. The boss says it isn't secure, wouldn't want the workers getting in to the emergency supplies." + +/obj/item/paper/fluff/awaymissions/robot_factory/spider + name = "Beware: Spider" + info = "Stop leaving your leftovers out! It's attracting bugs, and with bugs comes spiders. We've called an exterminator but the breakroom is off-limits until then." + +/obj/item/paper/fluff/awaymissions/robot_factory/classified + name = "Research Notes" + info = {"The biggest limiter to the efficiency of our robots have always been the rigid programming. The Board has ordered me to explore if it's feasible to use human minds instead of programming. \ + If possible they should make a formidable addition as a commander type robot.\ + We'd have to wipe their memories or I'm sure they wouldn't be happy..."} + +/obj/item/paper/crumpled/bloody/fluff/awaymissions/robot_factory/control_man + name = "paper" + info = {"Something went horribly wrong with the latest experiment... I'm not sure how to explain, but it's *alive* and it's *angry*. The higher ups will have my head for this if I don't get killed in action... + I'll send them a message to halt the latest shipment incase it was contaminated, and after that..."} + +/obj/item/paper/fluff/awaymissions/robot_factory/control_message + name = "message log" + info = {"Sending message with title 'SHIPMENT CONTAMINATION' failed. Please validate that communication dishes are working and try again."} + +/obj/item/paper/fluff/awaymissions/robot_factory/diagnostic + name = "diagnostic report" + info = {"Main servos offline. Main processor failing. Sending diagnostic data to master controller at location \[REDACTED\]."} + + +/obj/item/disk/holodisk/combat_robot/introduction + preset_image_type = /datum/preset_holoimage/cc_official + preset_record_text = {" + NAME HR Representative + DELAY 30 + SAY Welcome aboard your new home for the next 12 months! + DELAY 30 + SAY Your main duties will consist of refilling machinery, packing boxes, and most importantly.. + DELAY 45 + SAY Not asking any questions. + DELAY 30 + SAY In addition, please refrain from bothering the Corporate Liason stationed here unless he specifically asks for your help. + DELAY 45"} + + +/obj/item/disk/holodisk/combat_robot/classified + preset_image_type = /datum/preset_holoimage/cc_official + preset_record_text = {" + NAME Mr. Nakada + DELAY 30 + SAY Research log number 63 + DELAY 45 + SAY Further attempts to artifically grow and integrate a human host have failed. + DELAY 60 + SAY Attempting one further growth cycle before returning to Central Command + DELAY 60 + SAY Using the local supervisor as the neural template. + DELAY 60 + SAY Final report is estimated to be completed within the next two weeks. + DELAY 45"} + +/obj/item/disk/holodisk/combat_robot/experiment + preset_image_type = /datum/preset_holoimage/researcher + preset_record_text = {" + NAME Doctor Williams + DELAY 30 + SAY Beginning experiment number 31 + DELAY 60 + SAY Injecting solution... + DELAY 45 + SAY Subject appears to be displaying decreased blood pressure. Subject having difficulty maintaining consciousness. + DELAY 60 + SAY Neural activity appears incompatible with capture device. + DELAY 50 + SAY Subject has expired. End log for experiment number 31. + DELAY 45"} + +/obj/item/disk/holodisk/combat_robot/factory_floor + preset_image_type = /datum/preset_holoimage/nanotrasenprivatesecurity + preset_record_text = {" + NAME Officer Rymes + DELAY 30 + SAY After last nights incident I believe we should reiterate the corporate policy on rioting. + DELAY 45 + SAY In case of any kind of illegal striking or insurrection by the stationed workers you are to close the blast door to the factory floor. + DELAY 75 + SAY After the situation is under control and production ready to resume you should unlock the door. + DELAY 45 + SAY For the forgetful amongst you, the password is 'Zandar' after our dear CEO. + DELAY 45 + SAY Don't forget that the door is voice activated. + DELAY 45"} + +/obj/item/ai_cpu/self_aware + name = "semi self-aware neural processing unit" + desc = "The remains of the neuron interfacing chip found onboard a redacted robot production facility. The remaining organic material still seems alive." + + icon = 'icons/obj/surgery.dmi' + icon_state = "brain-x" + + speed = 20 + base_power_usage = 2 * AI_CPU_BASE_POWER_USAGE + + minimum_max_power = 1.1 + maximum_max_power = 2.8 + + minimum_growth = 1 + maximum_growth = 4.5 diff --git a/code/modules/awaymissions/mission_code/netmin/scientist_raid.dm b/code/modules/awaymissions/mission_code/netmin/scientist_raid.dm new file mode 100644 index 000000000000..c5998310867b --- /dev/null +++ b/code/modules/awaymissions/mission_code/netmin/scientist_raid.dm @@ -0,0 +1,49 @@ +/area/awaymission/vr/scientist_raid + name = "Small Abandoned Station" + icon_state = "awaycontent3" + +/obj/item/paper/fluff/awaymissions/scientist_raid/report1 + name = "Adaptive Neural Networks - Research Report" + info = "While these types of networks seem to be well-suited for our needs, the current processing technology doesn't seem able to simulate them quickly enough. More research is needed.." + +/obj/item/paper/fluff/awaymissions/scientist_raid/report2 + name = "Captive Organic Neurons - Research Report" + info = "A new scientific article has piqued my interest. A Cybersun Industries biologist seems to have extracted useable responses from lab-grown neurons. Although the experiment was small-scale it seems promising.." + +/obj/item/paper/fluff/awaymissions/scientist_raid/report3 + name = "Personnel Requisition Order" + info = "I require additional low-level personnel to maintain the station. Primarily janitors and low-level engineers. Due to the distance to the station they should preferably have minimal family and social contacts." + +/obj/item/paper/fluff/awaymissions/scientist_raid/report4 + name = "Deep Tissue Neuron Control" + info = "Further research reveals that using invasive surgical procedures it is possible to influence and digitally mirror the actions of individual neurons. Preliminary results show a 1251.83x performance improvement compared to traditional neural networks." + +/obj/item/paper/crumpled/bloody/fluff/awaymissions/scientist_raid/report5 + name = "hastily scribbled note" + info = "Forgive me for what I have done... Corporate goons are knocking down the door to my room, it seems they've caught on to my... unique ways of researching. I've hidden my last prototype in my safe. To anyone reading this, please carry on my research. The code to the safe is 7295" + +/obj/item/ai_cpu/organic + name = "experimental organic neural processing unit" + desc = "A half-machine half-human chip built by a mad scientist. Capable of processing immense amounts of data, at the expense of the sacrifice of the sanity of the consciousness contained within.." + icon_state = "cpuboard_adv" + + speed = 12 + base_power_usage = 4 * AI_CPU_BASE_POWER_USAGE + + minimum_max_power = 1.1 + maximum_max_power = 2.6 + + minimum_growth = 1 + maximum_growth = 4 + +/obj/item/storage/secure/safe/scientist_raid + name = "secure safe" + +/obj/item/storage/secure/safe/scientist_raid/Initialize(mapload) + . = ..() + l_code = "7295" + l_set = TRUE + new /obj/item/ai_cpu/organic(src) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + cut_overlays() + diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index c3e7bcd3f29e..d0fd93cd4224 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -172,6 +172,7 @@ light_range = 3 light_power = 0.75 light_color = LIGHT_COLOR_PURPLE + lava_temperature = 73 // cold, not hot /turf/open/lava/plasma/attackby(obj/item/I, mob/user, params) var/obj/item/reagent_containers/glass/C = I @@ -225,8 +226,8 @@ var/list/plasma_parts = list()//a list of the organic parts to be turned into plasma limbs var/list/robo_parts = list()//keep a reference of robotic parts so we know if we can turn them into a plasmaman var/mob/living/carbon/human/PP = L - var/S = PP.dna.species - if(istype(S, /datum/species/plasmaman) || istype(S, /datum/species/android) || istype(S, /datum/species/synth)) //ignore plasmamen/robotic species + var/datum/species/S = PP.dna.species + if(istype(S, /datum/species/plasmaman) || (S.inherent_biotypes & MOB_ROBOTIC)) //ignore plasmamen/robotic species continue for(var/BP in PP.bodyparts) diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index e49ad2be275e..5e93a82ad7dc 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -131,8 +131,14 @@ icon_state = "blobpod" var/triggered = 0 -/obj/effect/meatgrinder/Crossed(atom/movable/AM) +/obj/effect/meatgrinder/Initialize(mapload) . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/effect/meatgrinder/proc/on_entered(datum/source, atom/movable/AM, ...) Bumped(AM) /obj/effect/meatgrinder/Bumped(atom/movable/AM) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index 7c8af5490bb9..51fe7f547301 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -128,8 +128,13 @@ . = ..() var/newcolor = color2hex(pick(10;"green", 5;"blue", 3;"red", 1;"purple")) add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) -/obj/item/rupee/Crossed(atom/movable/AM) + +/obj/item/rupee/proc/on_entered(datum/source, atom/movable/AM, ...) if(!ismob(AM)) return var/mob/M = AM @@ -137,7 +142,6 @@ if(src != M.get_active_held_item()) M.swap_hand() equip_to_best_slot(M) - ..() /obj/item/rupee/equipped(mob/user, slot) playsound(get_turf(loc), 'sound/misc/server-ready.ogg', 50, 1, -1) diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm index 3224f4970bba..c9e2f0e5b5be 100644 --- a/code/modules/cargo/bounties/mech.dm +++ b/code/modules/cargo/bounties/mech.dm @@ -13,13 +13,8 @@ /datum/bounty/item/mech/mark_high_priority(scale_reward) return ..(max(scale_reward * 0.7, 1.2)) -/datum/bounty/item/mech/ripleymkii - name = "APLU MK-II \"Ripley\"" - reward = 13000 - wanted_types = list(/obj/mecha/working/ripley/mkii) - /datum/bounty/item/mech/firefighter - name = "APLU \"Firefighter\"" + name = "APLU MK-II \"Firefighter\"" reward = 18000 wanted_types = list(/obj/mecha/working/ripley/firefighter) diff --git a/code/modules/cargo/bounties/syndicate.dm b/code/modules/cargo/bounties/syndicate.dm deleted file mode 100644 index d3289478fc8b..000000000000 --- a/code/modules/cargo/bounties/syndicate.dm +++ /dev/null @@ -1,69 +0,0 @@ -/datum/bounty/item/syndicate - -/datum/bounty/item/syndicate/claim(mob/user) //Syndicate bounties add TCs to your uplink - if(can_claim()) - var/datum/mind/claimer = user.mind - if(claimer.find_syndicate_uplink()) - var/datum/component/uplink/U = claimer.find_syndicate_uplink() - U.telecrystals += reward - claimed = TRUE //to prevent deleting the TCs if you claim it with no uplink - -/datum/bounty/item/syndicate/reward_string() - return "!&@#WE'LL GIVE YOU [reward] TELECRYSTALS IF YOU DO THIS FOR US!#@*$" - -/datum/bounty/item/syndicate/saber - name = "!&@#THE CAPTAIN'S SABRE!#@*$" - description = "!&@#WE'RE TESTING OUT OUR ARMOR'S PROTECTIVE ABILITY, BUT WE NEED SOMETHING SHARP! PROVIDE IT TO US FOR A REWARD!#@*$" - wanted_types = list(/obj/item/melee/sabre) - reward = 5 -/datum/bounty/item/syndicate/capsuit - name = "!&@#THE CAPTAIN'S SWAT SUIT!#@*$" - description = "!&@#OUR NEW BATCH OF ARMOR-PIERCING ROUNDS HAVE JUST COME OFF THE PRODUCTION LINE, AND WE NEED SOMETHING TO TEST THEM ON! HELP US OUT AND YOU'LL BE REWARDED!#@*$" - wanted_types = list(/obj/item/clothing/suit/space/hardsuit/swat/captain) - reward = 4 -/datum/bounty/item/syndicate/aicontrol - name = "!&@#AI CONTROL CONSOLE BOARD!#@*$" - description = "!&@#A CONSOLE TO REMOTELY DISABLE AI UNITS WOULD BE QUITE HELPFUL FOR US, SO GET US ONE!#@*$" - wanted_types = list(/obj/item/circuitboard/computer/ai_upload_download) - reward = 2 -/datum/bounty/item/syndicate/rdsuit - name = "!&@#PROTOTYPE HARDSUIT!#@*$" - description = "!&@#WE'RE INTERESTED IN DEVELOPING ARMOR THAT CAN RESIST EXPLOSIVES BETTER. THE PROTOTYPE HARDSUIT WOULD BE HELPFUL FOR THIS GOAL!#@*$" - wanted_types = list(/obj/item/clothing/suit/space/hardsuit/rd) - reward = 3 -/datum/bounty/item/syndicate/boh - name = "!&@#BAG OF HOLDING!#@*$" - description = "!&@#EXPERIMENTAL BLUESPACE TECHNOLOGY LIKE A BAG OF HOLDING WOULD BE APPRECIATED BY THE LAB BOYS. THEY'RE WILLING TO PAY HANDSOMELY, TOO#@*$" - wanted_types = list(/obj/item/storage/backpack/holding,/obj/item/storage/backpack/holding/rd) - reward = 4 -/datum/bounty/item/syndicate/aeg - name = "!&@#ADVANCED ENERGY GUN!#@*$" - description = "!&@#WE'RE LOOKING FOR FLAWS IN NANOTRASEN WEAPONS TECHNOLOGY TO EXPLOIT. SEND US SOME EXAMPLES OF THEIR TECHNOLOGY, AND WE'LL REWARD YOU#@*$" - wanted_types = list(/obj/item/gun/energy/e_gun/nuclear) - required_count = 3 - reward = 5 -/datum/bounty/item/syndicate/aiupload - name = "!&@#AI UPLOAD CONSOLE BOARD!#@*$" - description = "!&@#WE'RE PROBING NANOTRASEN AIS FOR SECURITY FLAWS. A CONSOLE LIKE THIS COULD ACCOMPLISH OUR GOAL#@*$" - wanted_types = list(/obj/item/circuitboard/computer/aiupload) - reward = 5 -/datum/bounty/item/syndicate/borgupload - name = "!&@#CYBORG UPLOAD CONSOLE BOARD!#@*$" - description = "!&@#WE'RE PROBING NANOTRASEN CYBORGS FOR SECURITY FLAWS. A CONSOLE LIKE THIS COULD ACCOMPLISH OUR GOAL#@*$" - wanted_types = list(/obj/item/circuitboard/computer/borgupload) - reward = 2 -/datum/bounty/item/syndicate/wardenshotgun - name = "!&@#COMPACT COMBAT SHOTGUN!#@*$" - description = "!&@#WHILE INFERIOR TO OUR BULLDOG SHOTGUNS, COMPACT COMBAT SHOTGUNS CONTAIN AN EXPENSIVE PART THAT'S REQUIRED TO MANUFACTURE BULLDOG SHOTGUNS. YOU'LL SAVE US A PRETTY PENNY BY GIVING US ONE, AND WE'LL PAY YOU IN RETURN#@*$" - wanted_types = list(/obj/item/gun/ballistic/shotgun/automatic/combat/compact) - reward = 5 //you gotta kill the warden //not harder than killing a captain -/datum/bounty/item/syndicate/advancedhardsuit - name = "!&@#ADVANCED HARDSUIT!#@*$" - description = "!&@#THE RADIATION SHIELDING BUILT INTO THE ADVANCED HARDSUIT IS SERIOUSLY HIGH-TECH, AND WE WANT A GOOD LOOK AT IT. BRING IT TO US AND WE'LL GIVE YOU A REWARD.#@*$" - wanted_types = list(/obj/item/clothing/suit/space/hardsuit/engine/elite) - reward = 5 -/datum/bounty/item/syndicate/phazon - name = "!&@#PHAZON EXOSUIT!#@*$" - description = "!&@#WE'D LOVE TO GET OUR HANDS ON ONE OF THESE. IT MAY BE HARD TO SOURCE, BUT WE WILL REWARD YOU GENEROUSLY IF YOU SUCCEED.#@*$" - wanted_types = list(/obj/mecha/combat/phazon) - reward = 10 //you need an anomaly core and robotics for this one broski, it's gotta be worth a lot diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index cd4b156ad934..2a98d2caa9ec 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -1,5 +1,4 @@ GLOBAL_LIST_EMPTY(bounties_list) -GLOBAL_LIST_EMPTY(bounties_list_syndicate) /datum/bounty var/name @@ -58,19 +57,16 @@ GLOBAL_LIST_EMPTY(bounties_list_syndicate) /proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE) if(!GLOB.bounties_list.len) setup_bounties() - if(!GLOB.bounties_list_syndicate.len) - setup_syndicate_bounties() var/list/matched_one = FALSE for(var/thing in reverse_range(AM.get_all_contents())) var/matched_this = FALSE - for(var/list/i in list(GLOB.bounties_list,GLOB.bounties_list_syndicate)) - for(var/datum/bounty/B in i) - if(B.applies_to(thing)) - matched_one = TRUE - matched_this = TRUE - if(!dry_run) - B.ship(thing) + for(var/datum/bounty/B as anything in GLOB.bounties_list) + if(B.applies_to(thing)) + matched_one = TRUE + matched_this = TRUE + if(!dry_run) + B.ship(thing) if(!dry_run && matched_this) qdel(thing) return matched_one @@ -204,23 +200,6 @@ GLOBAL_LIST_EMPTY(bounties_list_syndicate) for(var/low_priority_bounty in low_priority_strict_type_list) try_add_bounty(new low_priority_bounty) -/proc/setup_syndicate_bounties() //Much simpler as we're only picking from one pool of bounties - for(var/i in 0 to 5) - var/pick = pick(subtypesof(/datum/bounty/item/syndicate)) - if(!(try_add_syndie_bounty(new pick))) - i -= 1 - - -/proc/try_add_syndie_bounty(datum/bounty/new_bounty) - if(!new_bounty || !new_bounty.name || !new_bounty.description) - return FALSE - for(var/i in GLOB.bounties_list_syndicate) - var/datum/bounty/B = i - if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B)) - return FALSE - GLOB.bounties_list_syndicate += new_bounty - return TRUE - /proc/completed_bounty_count() var/count = 0 for(var/i in GLOB.bounties_list) diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm index de917a924e00..a8f74dec826e 100644 --- a/code/modules/cargo/bounty_console.dm +++ b/code/modules/cargo/bounty_console.dm @@ -31,27 +31,12 @@
  • Reward: [B.reward_string()]
  • Completed: [B.completion_string()]
"} -/obj/machinery/computer/bounty/emag_act(mob/user, obj/item/card/emag/emag_card) - if(obj_flags & EMAGGED) - return FALSE - if(istype(emag_card, /obj/item/card/emag/improvised)) // We can't have nice things. - to_chat(user, span_notice("The cheap circuitry isn't strong enough to subvert this!")) - return FALSE - to_chat(user, span_warning("You adjust the antenna on \The [src], tuning it to a syndicate frequency.")) - obj_flags |= EMAGGED - do_sparks(8, FALSE, loc) - return TRUE - /obj/machinery/computer/bounty/proc/get_list_to_use() - if(obj_flags & EMAGGED) - return GLOB.bounties_list_syndicate return GLOB.bounties_list /obj/machinery/computer/bounty/ui_interact(mob/user, datum/tgui/ui) var/list/list_to_use = get_list_to_use() if(!list_to_use.len) - if(get_list_to_use() == GLOB.bounties_list_syndicate) - setup_syndicate_bounties() setup_bounties() ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -65,7 +50,6 @@ bountyinfo += list(list("name" = B.name, "description" = B.description, "reward_string" = B.reward_string(), "completion_string" = B.completion_string() , "claimed" = B.claimed, "can_claim" = B.can_claim(), "priority" = B.high_priority, "bounty_ref" = REF(B))) data["stored_cash"] = cargocash.account_balance data["bountydata"] = bountyinfo - data["emagged"] = (obj_flags & EMAGGED) return data /obj/machinery/computer/bounty/ui_act(action,params) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 490b2057bbf5..7d3d813eceba 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -12,8 +12,8 @@ var/can_approve_requests = TRUE var/contraband = FALSE var/safety_warning = "For safety reasons, the automated supply shuttle \ - cannot transport live organisms, human remains, classified nuclear weaponry \ - or homing beacons. Additionally, remove any privately ordered crates from the shuttle." + cannot transport live organisms, human remains, classified nuclear weaponry, \ + homing beacons or pneumatic disposal segments. Additionally, remove any privately ordered crates from the shuttle." var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." var/self_paid = FALSE @@ -148,7 +148,14 @@ investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO) else investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO) - say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") + var/call_time = SSshuttle.supply.timeLeft(10) //how many seconds + var/unit = "seconds" + if(call_time >= 60) //if more than 60 seconds, + call_time = SSshuttle.supply.timeLeft(600) //go to minutes instead + unit = "minute" + if(call_time > 1) //handles more than 1 minute + unit = "minutes" + say("The supply shuttle has been called and will arrive in [call_time] [unit].") SSshuttle.moveShuttle("supply", "supply_home", TRUE) . = TRUE if("loan") diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 30ddf37ea894..d4dae56958cc 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -61,6 +61,7 @@ /obj/structure/closet/supplypod/bluespacepod style = STYLE_BLUESPACE bluespace = TRUE + flags_1 = NODECONSTRUCT_1|PREVENT_CONTENTS_EXPLOSION_1 explosionSize = list(0,0,1,2) delays = list(POD_TRANSIT = 15, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) @@ -70,12 +71,14 @@ specialised = TRUE style = STYLE_SYNDICATE bluespace = TRUE + flags_1 = NODECONSTRUCT_1|PREVENT_CONTENTS_EXPLOSION_1 explosionSize = list(0,0,1,2) delays = list(POD_TRANSIT = 25, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) /obj/structure/closet/supplypod/centcompod style = STYLE_CENTCOM bluespace = TRUE + flags_1 = NODECONSTRUCT_1|PREVENT_CONTENTS_EXPLOSION_1 explosionSize = list(0,0,0,0) delays = list(POD_TRANSIT = 20, POD_FALLING = 4, POD_OPENING = 30, POD_LEAVING = 30) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF @@ -178,12 +181,6 @@ if(decal) . += decal -/obj/structure/closet/supplypod/tool_interact(obj/item/W, mob/user) - if(bluespace) //We dont want to worry about interacting with bluespace pods, as they are due to delete themselves soon anyways. - return FALSE - else - ..() - /obj/structure/closet/supplypod/ex_act() //Explosions dont do SHIT TO US! This is because supplypods create explosions when they land. return @@ -199,6 +196,7 @@ /obj/structure/closet/supplypod/proc/handleReturnAfterDeparting(atom/movable/holder = src) reversing = FALSE //Now that we're done reversing, we set this to false (otherwise we would get stuck in an infinite loop of calling the close proc at the bottom of open_pod() ) bluespace = TRUE //Make it so that the pod doesn't stay in centcom forever + flags_1 = NODECONSTRUCT_1|PREVENT_CONTENTS_EXPLOSION_1 pod_flags &= ~FIRST_SOUNDS //Make it so we play sounds now if (!effectQuiet && style != STYLE_SEETHROUGH) audible_message(span_notice("The pod hisses, closing and launching itself away from the station."), span_notice("The ground vibrates, and you hear the sound of engines firing.")) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8ba670c445a3..2592ed4859da 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -79,7 +79,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) /// If set to TRUE, will update character_profiles on the next ui_data tick. var/tainted_character_profiles = FALSE - ///removed, kept here for migration in 'legacy_mood_migration.dm' ///DO NOT USE THIS! var/yogtoggles diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index dd07e425d30a..498e52582281 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -107,12 +107,16 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(parent.hotkeys) for(var/hotkeytobind in kb.hotkey_keys) - if(!length(binds_by_key[hotkeytobind]) && hotkeytobind != "Unbound") //Only bind to the key if nothing else is bound expect for Unbound + if(hotkeytobind == "Unbound") + addedbind = TRUE + else if(!length(binds_by_key[hotkeytobind])) //Only bind to the key if nothing else is bound key_bindings[kb.name] |= hotkeytobind addedbind = TRUE else for(var/classickeytobind in kb.classic_keys) - if(!length(binds_by_key[classickeytobind]) && classickeytobind != "Unbound") //Only bind to the key if nothing else is bound expect for Unbound + if(classickeytobind == "Unbound") + addedbind = TRUE + else if(!length(binds_by_key[classickeytobind])) //Only bind to the key if nothing else is bound key_bindings[kb.name] |= classickeytobind addedbind = TRUE @@ -183,7 +187,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) player_alt_titles = SANITIZE_LIST(player_alt_titles) - toggles = sanitize_integer(toggles, 0, ~0, initial(toggles)) // Yogs -- Fixes toggles not having >16 bits of flagspace + toggles = sanitize_integer(toggles, 0, SHORT_REAL_LIMIT-1, initial(toggles)) key_bindings = sanitize_keybindings(key_bindings) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 43562cd6d269..dd04f34ac01a 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -1,5 +1,8 @@ #define EMP_RANDOMISE_TIME 300 +/atom/proc/on_chameleon_change() + return + /datum/action/item_action/chameleon/drone/randomise name = "Randomise Headgear" button_icon = 'icons/mob/actions/actions_items.dmi' @@ -218,16 +221,39 @@ thing.update_slot_icon() build_all_button_icons() -/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item, obj/item/target = src.target) //yogs -- add support for cham hardsuits - target.name = initial(picked_item.name) - target.desc = initial(picked_item.desc) - target.icon_state = initial(picked_item.icon_state) - if(isitem(target)) - var/obj/item/I = target - I.item_state = initial(picked_item.item_state) - I.mob_overlay_icon = initial(picked_item.mob_overlay_icon) - if(istype(I, /obj/item/clothing) && istype(picked_item, /obj/item/clothing)) - var/obj/item/clothing/CL = I +/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) //yogs -- add support for cham hardsuits + var/atom/atom_target = target + atom_target.name = initial(picked_item.name) + atom_target.desc = initial(picked_item.desc) + atom_target.icon_state = initial(picked_item.icon_state) + + if(isitem(atom_target)) + var/obj/item/item_target = target + item_target.mob_overlay_icon = initial(picked_item.mob_overlay_icon) + item_target.lefthand_file = initial(picked_item.lefthand_file) + item_target.righthand_file = initial(picked_item.righthand_file) + if(initial(picked_item.greyscale_colors)) + if(initial(picked_item.greyscale_config_worn)) + item_target.mob_overlay_icon = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config_worn), + initial(picked_item.greyscale_colors), + ) + if(initial(picked_item.greyscale_config_inhand_left)) + item_target.lefthand_file = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config_inhand_left), + initial(picked_item.greyscale_colors), + ) + + if(initial(picked_item.greyscale_config_inhand_right)) + item_target.righthand_file = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config_inhand_right), + initial(picked_item.greyscale_colors), + ) + + item_target.worn_icon_state = initial(picked_item.worn_icon_state) + item_target.item_state = initial(picked_item.item_state) + if(isclothing(item_target) && ispath(picked_item, /obj/item/clothing)) + var/obj/item/clothing/CL = item_target var/obj/item/clothing/PCL = picked_item CL.flags_cover = initial(PCL.flags_cover) CL.flags_inv = initial(PCL.flags_inv) @@ -235,7 +261,17 @@ var/obj/item/clothing/mask/chameleon/CH = CL if(CH.vchange) CH.flags_inv |= HIDEFACE // We want the chameleon mask hiding the face to retain voice changing! - if(istype(target, /obj/item/clothing/suit/space/hardsuit/infiltration)) //YOGS START + + if(initial(picked_item.greyscale_config) && initial(picked_item.greyscale_colors)) + atom_target.icon = SSgreyscale.GetColoredIconByType( + initial(picked_item.greyscale_config), + initial(picked_item.greyscale_colors), + ) + + else + atom_target.icon = initial(picked_item.icon) + + if(istype(atom_target, /obj/item/clothing/suit/space/hardsuit/infiltration)) //YOGS START var/obj/item/clothing/suit/space/hardsuit/infiltration/I = target var/obj/item/clothing/suit/space/hardsuit/HS = picked_item var/obj/item/clothing/head/helmet/helmet = initial(HS.helmettype) @@ -244,8 +280,9 @@ I.head_piece.update_appearance(UPDATE_ICON) qdel(helmet) //YOGS END - target.icon = initial(picked_item.icon) - target.on_chameleon_change() + + atom_target.icon = initial(picked_item.icon) + atom_target.on_chameleon_change() current_disguise = picked_item /datum/action/item_action/chameleon/change/Trigger() @@ -272,8 +309,13 @@ /obj/item/clothing/under/chameleon //starts off as black name = "black jumpsuit" - icon_state = "black" - item_state = "bl_suit" + icon_state = "jumpsuit" + mob_overlay_icon = 'icons/mob/clothing/uniform/color.dmi' + greyscale_colors = "#3f3f3f" + greyscale_config = /datum/greyscale_config/jumpsuit + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_inhand_right + greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn desc = "It's a plain jumpsuit. It has a small dial on the wrist." sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle?? random_sensor = FALSE @@ -289,6 +331,12 @@ /obj/item/clothing/under/chameleon/ratvar name = "ratvarian engineer's jumpsuit" desc = "A tough jumpsuit woven from alloy threads. It can take on the appearance of other jumpsuits." + mob_overlay_icon = 'icons/mob/clothing/uniform/uniform.dmi' + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null icon_state = "engine" item_state = "engi_suit" @@ -595,7 +643,11 @@ /obj/item/clothing/shoes/chameleon name = "black shoes" - icon_state = "black" + icon_state = "sneakers" + item_state = "sneakers_back" + greyscale_colors = "#545454#ffffff" + greyscale_config = /datum/greyscale_config/sneakers + greyscale_config_worn = /datum/greyscale_config/sneakers_worn desc = "A pair of black shoes." resistance_flags = NONE armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 0, FIRE = 50, ACID = 50, ELECTRIC = 100) @@ -624,9 +676,6 @@ chameleon_action.emp_randomise() /obj/item/clothing/shoes/chameleon/noslip - name = "black shoes" - icon_state = "black" - desc = "A pair of black shoes." clothing_flags = NOSLIP can_be_bloody = FALSE @@ -773,6 +822,3 @@ /obj/item/stamp/chameleon/broken/Initialize(mapload) . = ..() chameleon_action.emp_randomise(INFINITY) - -/obj/item/proc/on_chameleon_change() - return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3914e3abc87e..096eb536c2ad 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -117,7 +117,7 @@ /obj/item/clothing/proc/repair(mob/user, params) damaged_clothes = CLOTHING_PRISTINE update_clothes_damaged_state(FALSE) - obj_integrity = max_integrity + update_integrity(max_integrity) name = initial(name) // remove "tattered" or "shredded" if there's a prefix body_parts_covered = initial(body_parts_covered) slot_flags = initial(slot_flags) @@ -161,7 +161,7 @@ * * Arguments: * * def_zone: The bodypart zone we're disabling - * * damage_type: Only really relevant for the verb for describing the breaking, and maybe obj_destruction() + * * damage_type: Only really relevant for the verb for describing the breaking, and maybe atom_destruction() */ /obj/item/clothing/proc/disable_zone(def_zone, damage_type) var/list/covered_limbs = cover_flags2body_zones(body_parts_covered) @@ -181,7 +181,7 @@ body_parts_covered &= ~i if(body_parts_covered == NONE) // if there are no more parts to break then the whole thing is kaput - obj_destruction((damage_type == BRUTE ? MELEE : LASER)) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs + atom_destruction((damage_type == BRUTE ? MELEE : LASER)) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs return damaged_clothes = CLOTHING_DAMAGED @@ -301,7 +301,8 @@ additional_info += "\nIt will block [english_list(things_blocked)]." to_chat(usr, "[armor.show_protection_classes(additional_info)]") -/obj/item/clothing/obj_break(damage_flag) +/obj/item/clothing/atom_break(damage_flag) + . = ..() damaged_clothes = CLOTHING_DAMAGED update_clothes_damaged_state() if(ismob(loc)) //It's not important enough to warrant a message if nobody's wearing it @@ -336,17 +337,19 @@ SEE_PIXELS// if an object is located on an unlit area, but some of its pixels ar BLIND // can't see anything */ -/proc/generate_female_clothing(index,t_color,icon,type) //In a shellnut, blends the uniform sprite with a pre-made sprite in uniform.dmi that's mostly white pixels with a few empty ones to trim off the pixels in the empty spots - var/icon/female_clothing_icon = icon(icon, t_color) // and make the uniform the "female" shape. female_s is either the top-only one (for jumpskirts and the like) or the full one (for jumpsuits) - var/icon/female_s = icon('icons/effects/clothing.dmi', "[(type == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]") +/proc/generate_female_clothing(index, t_color, icon, type) //In a shellnut, blends the uniform sprite with a pre-made sprite in uniform.dmi that's mostly white pixels with a few empty ones to trim off the pixels in the empty spots + var/icon/female_clothing_icon = icon("icon" = icon, "icon_state" = t_color) // and make the uniform the "female" shape. female_s is either the top-only one (for jumpskirts and the like) or the full one (for jumpsuits) + var/icon/female_s = icon("icon" = 'icons/effects/clothing.dmi', "icon_state" = "[(type == FEMALE_UNIFORM_FULL) ? "female_full" : "female_top"]") female_clothing_icon.Blend(female_s, ICON_MULTIPLY) - GLOB.female_clothing_icons[index] = fcopy_rsc(female_clothing_icon) //Then it saves the icon in a global list so it doesn't have to make it again + female_clothing_icon = fcopy_rsc(female_clothing_icon) + GLOB.female_clothing_icons[index] = female_clothing_icon //Then it saves the icon in a global list so it doesn't have to make it again -/proc/generate_skinny_clothing(index,t_color,icon,type) //Works the exact same as above but for skinny people - var/icon/skinny_clothing_icon = icon(icon, t_color) - var/icon/skinny_s = icon('icons/effects/clothing.dmi', "[(type == FEMALE_UNIFORM_FULL) ? "skinny_full" : "skinny_top"]") //Hooks into same check to see if it's eligible +/proc/generate_skinny_clothing(index, t_color, icon, type) //Works the exact same as above but for skinny people + var/icon/skinny_clothing_icon = icon(icon, t_color) + var/icon/skinny_s = icon("icon" = 'icons/effects/clothing.dmi', "icon_state" = "[(type == FEMALE_UNIFORM_FULL) ? "skinny_full" : "skinny_top"]") //Hooks into same check to see if it's eligible skinny_clothing_icon.Blend(skinny_s, ICON_MULTIPLY) - GLOB.skinny_clothing_icons[index] = fcopy_rsc(skinny_clothing_icon) + skinny_clothing_icon = fcopy_rsc(skinny_clothing_icon) + GLOB.skinny_clothing_icons[index] = skinny_clothing_icon /obj/item/clothing/under/verb/toggle() set name = "Adjust Suit Sensors" @@ -357,6 +360,9 @@ BLIND // can't see anything return if (!can_use(M)) return + if(is_synth(M)) + to_chat(usr, "You're unable to use suit sensors as a synthetic!") + return if(src.has_sensor == LOCKED_SENSORS) to_chat(usr, "The controls are locked.") return 0 @@ -492,7 +498,7 @@ BLIND // can't see anything return TRUE return FALSE -/obj/item/clothing/obj_destruction(damage_flag) +/obj/item/clothing/atom_destruction(damage_flag, total_destruction=FALSE) if(damage_flag == BOMB) var/turf/T = get_turf(src) spawn(1) //so the shred survives potential turf change from the explosion. diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 64c244fa5b72..229f4fc0b3cc 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -11,22 +11,21 @@ materials = list(/datum/material/glass = 250) var/vision_flags = 0 var/invis_view = SEE_INVISIBLE_LIVING //admin only for now - var/invis_override = 0 //Override to allow glasses to set higher than normal see_invis - var/list/icon/current = list() //the current hud icons - var/vision_correction = 0 //does wearing these glasses correct some of our vision defects? - var/glass_colour_type //colors your vision when worn - + /// Override to allow glasses to set higher than normal see_invis + var/invis_override = 0 /// A percentage of how much rgb to "max" on the lighting plane /// This lets us brighten darkness without washing out bright color var/lighting_cutoff = null /// Similar to lighting_cutoff, except it has individual r g and b components in the same 0-100 scale var/list/color_cutoffs = null -// Potentially replace glass_color_type with a setup that colors lighting by dropping segments of different componets -// Like the current idea, but applied without the mass cutoff (maybe? somehow?) -// That or just a light color to the lighting plane, that'd work too -// Enough to make it visible but not so much that it's a pain - -// That, or just make stuff that uses lighting_cutoff have colored offsets and all, like you were planning + /// The current hud icons + var/list/icon/current = list() + /// Colors your vision when worn + var/glass_colour_type + /// Whether or not vision coloring is forcing + var/forced_glass_color = FALSE + //does wearing these glasses correct some of our vision defects? + var/vision_correction = 0 /obj/item/clothing/glasses/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is stabbing \the [src] into [user.p_their()] eyes! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -176,7 +175,6 @@ flash_protect = 1 // Dark green color_cutoffs = list(10, 30, 10) - /obj/item/clothing/glasses/monocle name = "monocle" @@ -360,7 +358,7 @@ return ..() /obj/item/clothing/glasses/blindfold/white/worn_overlays(isinhands = FALSE, file2use) - . = list() + . = ..() if(!isinhands && ishuman(loc) && !colored_before) var/mob/living/carbon/human/H = loc var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes/eyes.dmi', "blindfoldwhite") @@ -533,14 +531,13 @@ return ..() && isliving(owner) /datum/action/cooldown/expose/Activate(atom/exposed) - StartCooldown(15 SECONDS) - if(owner.stat != CONSCIOUS) return FALSE if(!isliving(exposed) || exposed == owner) owner.balloon_alert(owner, "invalid exposed!") return FALSE - + StartCooldown(15 SECONDS) + var/mob/living/living_exposed = exposed living_exposed.apply_status_effect(STATUS_EFFECT_EXPOSED) living_exposed.adjust_jitter(5 SECONDS) diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index fec4a268aed9..94552ca5483f 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -27,7 +27,7 @@ return OXYLOSS /obj/item/clothing/gloves/worn_overlays(isinhands = FALSE) - . = list() + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 35487d05043d..9db96bc9f247 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -19,14 +19,23 @@ /obj/item/clothing/head/worn_overlays(isinhands = FALSE) . = ..() - if(!isinhands) - if(damaged_clothes) - . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") - if(HAS_BLOOD_DNA(src)) - var/mutable_appearance/bloody_helmet = mutable_appearance('icons/effects/blood.dmi', "helmetblood") - bloody_helmet.color = get_blood_dna_color(return_blood_DNA()) - . += bloody_helmet - + if(isinhands) + return + + if(damaged_clothes) + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") + + if(!HAS_BLOOD_DNA(src)) + return + + var/mutable_appearance/bloody_helmet + if(clothing_flags & LARGE_WORN_ICON) + bloody_helmet = mutable_appearance('icons/effects/64x64.dmi', "helmetblood_large") + else + bloody_helmet = mutable_appearance('icons/effects/blood.dmi', "helmetblood") + bloody_helmet.color = get_blood_dna_color(return_blood_DNA()) + . += bloody_helmet + /obj/item/clothing/head/update_clothes_damaged_state() ..() if(ismob(loc)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 4b940f5f2c15..b7adf9f270f5 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -477,6 +477,7 @@ icon_state = "h2helmet" item_state = "h2helmet" armor = list(MELEE = 35, BULLET = 30, LASER = 25, ENERGY = 30, BOMB = 20, BIO = 10, RAD = 50, FIRE = 65, ACID = 40, WOUND = 15) + material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix flags_inv = HIDEMASK | HIDEEARS | HIDEEYES | HIDEFACE | HIDEHAIR flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH cold_protection = HEAD @@ -543,3 +544,4 @@ w_class = WEIGHT_CLASS_BULKY // Does not cover additional limbs like vest does plating = K + diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f27d58e42f10..8d5e6c83f179 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -237,6 +237,7 @@ /obj/item/clothing/head/sombrero name = "sombrero" + icon = 'icons/obj/clothing/sombrero.dmi' icon_state = "sombrero" item_state = "sombrero" desc = "You can practically taste the fiesta." @@ -244,20 +245,26 @@ dog_fashion = /datum/dog_fashion/head/sombrero + greyscale_config = /datum/greyscale_config/sombrero + greyscale_config_worn = /datum/greyscale_config/sombrero/worn + greyscale_config_inhand_left = /datum/greyscale_config/sombrero/lefthand + greyscale_config_inhand_right = /datum/greyscale_config/sombrero/righthand + /obj/item/clothing/head/sombrero/green name = "green sombrero" - icon_state = "greensombrero" - item_state = "greensombrero" desc = "As elegant as a dancing cactus." flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS dog_fashion = null + greyscale_colors = "#13d968#ffffff" + flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/head/sombrero/shamebrero name = "shamebrero" icon_state = "shamebrero" - item_state = "shamebrero" desc = "Once it's on, it never comes off." dog_fashion = null + greyscale_colors = "#d565d3#f8db18" + flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/head/sombrero/shamebrero/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index b6cfcd594d57..04d730bdad2f 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -230,7 +230,7 @@ . += M /obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, file2use) - . = list() + . = ..() if(!isinhands) var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style] if(!S) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 63fbf97f7790..2aaa2bf878ae 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -31,7 +31,7 @@ /obj/item/clothing/mask/proc/handle_speech() /obj/item/clothing/mask/worn_overlays(isinhands = FALSE) - . = list() + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 5579278a21a3..70084ff9db3f 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -375,7 +375,7 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( /obj/item/clothing/mask/rmask name = "dusty mask" - desc = "A face is nothing, it’s what’s inside that matters." + desc = "A face is nothing, it's what's inside that matters." icon_state = "rmask" item_state = "rmaks" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR @@ -384,7 +384,7 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( /obj/item/clothing/mask/pocketcatmask name = "peculiar cat mask" - desc = "this mask makes you a little uneasy" + desc = "This mask makes you a little uneasy." icon_state = "pocketmask" item_state = "pocketmask" flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index ef688f6ef4f1..986002424837 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -7,7 +7,7 @@ equip_delay_other = 40 /obj/item/clothing/neck/worn_overlays(isinhands = FALSE) - . = list() + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) diff --git a/code/modules/clothing/neck/skillcapes/skillcapes.dm b/code/modules/clothing/neck/skillcapes/skillcapes.dm index 56972e5a33bc..6d67e97bed06 100644 --- a/code/modules/clothing/neck/skillcapes/skillcapes.dm +++ b/code/modules/clothing/neck/skillcapes/skillcapes.dm @@ -11,7 +11,7 @@ /obj/item/clothing/neck/skillcape/trimmed name = "trimmed cape of skill" - desc = "a golden trimmed cape, marks proof of excellence." + desc = "A golden-trimmed cape, marks proof of excellence." /obj/item/clothing/neck/skillcape/admin name = "cape of mighty judgement" diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 7b4a39e43e17..8c3d41d32940 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -47,10 +47,8 @@ back = /obj/item/storage/backpack/ert belt = /obj/item/storage/belt/security/full mask = /obj/item/clothing/mask/gas/sechailer - backpack_contents = list( - /obj/item/storage/box/engineer=1, - /obj/item/melee/baton/loaded=1 - ) + box = /obj/item/storage/box/survival/engineer + backpack_contents = list(/obj/item/melee/baton/loaded=1) l_pocket = /obj/item/switchblade /datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -68,10 +66,6 @@ glasses = /obj/item/clothing/glasses/thermal/eyepatch mask = /obj/item/clothing/mask/gas/sechailer/swat suit_store = /obj/item/gun/energy/e_gun/stun - backpack_contents = list( - /obj/item/storage/box/engineer=1, - /obj/item/melee/baton/loaded=1 - ) l_pocket = /obj/item/melee/transforming/energy/sword/saber /datum/outfit/ert/security @@ -84,8 +78,8 @@ belt = /obj/item/storage/belt/security/full suit_store = /obj/item/gun/energy/e_gun mask = /obj/item/clothing/mask/gas/sechailer + box = /obj/item/storage/box/survival/engineer backpack_contents = list( - /obj/item/storage/box/engineer=1, /obj/item/storage/box/zipties=1, /obj/item/melee/baton/loaded=1 ) @@ -105,7 +99,6 @@ mask = /obj/item/clothing/mask/gas/sechailer/swat suit_store = /obj/item/gun/energy/e_gun/stun backpack_contents = list( - /obj/item/storage/box/engineer=1, /obj/item/storage/box/handcuffs=1, /obj/item/melee/baton/loaded=1 ) @@ -203,7 +196,6 @@ suit_store = /obj/item/gun/energy/e_gun mask = /obj/item/clothing/mask/gas/sechailer backpack_contents = list( - /obj/item/storage/box/engineer=1, /obj/item/assembly/flash/handheld=1, /obj/item/grenade/flashbang=1, /obj/item/reagent_containers/spray/pepper=1 @@ -215,9 +207,7 @@ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor mask = /obj/item/clothing/mask/gas/sechailer suit_store = /obj/item/gun/energy/e_gun/stun - - backpack_contents = list(/obj/item/storage/box/engineer=1, - /obj/item/storage/box/handcuffs=1, + backpack_contents = list(/obj/item/storage/box/handcuffs=1,\ /obj/item/melee/baton/loaded=1, /obj/item/construction/rcd/loaded=1) @@ -231,9 +221,8 @@ l_pocket = /obj/item/reagent_containers/autoinjector/combat r_pocket = /obj/item/reagent_containers/autoinjector/combat/heresypurge suit_store = /obj/item/gun/medbeam - + box = /obj/item/storage/box/survival/engineer backpack_contents = list( - /obj/item/storage/box/engineer=1, /obj/item/melee/baton/loaded=1, /obj/item/storage/firstaid/toxin=1, /obj/item/storage/firstaid/fire=1, @@ -261,9 +250,8 @@ belt = /obj/item/storage/belt/soulstone suit_store = /obj/item/gun/energy/e_gun l_pocket = /obj/item/nullrod - backpack_contents = list( - /obj/item/storage/box/engineer=1 - ) + box = /obj/item/storage/box/survival/engineer + backpack_contents = null /datum/outfit/ert/chaplain/inquisitor name = "Inquisition Chaplain" @@ -271,9 +259,6 @@ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor r_pocket = /obj/item/grenade/chem_grenade/holy belt = /obj/item/storage/belt/soulstone/full/chappy - backpack_contents = list( - /obj/item/storage/box/engineer=1 - ) /datum/outfit/ert/janitor name = "ERT Janitor" @@ -287,8 +272,8 @@ r_pocket = /obj/item/grenade/chem_grenade/cleaner l_pocket = /obj/item/grenade/chem_grenade/cleaner mask = /obj/item/clothing/mask/gas/sechailer - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/storage/box/lights/mixed=1,\ + box = /obj/item/storage/box/survival/engineer + backpack_contents = list(/obj/item/storage/box/lights/mixed=1,\ /obj/item/mop/advanced=1,\ /obj/item/reagent_containers/glass/bucket=1,\ /obj/item/grenade/clusterbuster/cleaner=1) @@ -305,8 +290,7 @@ /datum/outfit/ert/janitor/heavy name = "ERT Janitor - Heavy Duty" - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/reagent_containers/spray/chemsprayer/janitor=1,\ + backpack_contents = list(/obj/item/reagent_containers/spray/chemsprayer/janitor=1,\ /obj/item/storage/box/lights/mixed=1,\ /obj/item/melee/classic_baton/telescopic=1,\ /obj/item/grenade/clusterbuster/cleaner=3) @@ -325,8 +309,8 @@ mask = /obj/item/clothing/mask/gas/explorer shoes = /obj/item/clothing/shoes/bhop uniform = /obj/item/clothing/under/rank/miner/lavaland + box = /obj/item/storage/box/survival/mining backpack_contents = list( - /obj/item/storage/box/survival_mining=1, /obj/item/crusher_trophy/demon_claws=1, /obj/item/crusher_trophy/watcher_wing=1, /obj/item/reagent_containers/autoinjector/medipen/survival=3, @@ -349,7 +333,7 @@ /datum/outfit/centcom_clown name = "Code Banana ERT" id = /obj/item/card/id/centcom - belt = /obj/item/pda/clown + belt = /obj/item/modular_computer/tablet/pda/preset/clown ears = /obj/item/radio/headset/headset_cent uniform = /obj/item/clothing/under/rank/clown back = /obj/item/storage/backpack/clown diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm index 70d16f3ae962..d1b79f681b42 100644 --- a/code/modules/clothing/outfits/event.dm +++ b/code/modules/clothing/outfits/event.dm @@ -9,7 +9,7 @@ r_pocket = /obj/item/flashlight gloves = /obj/item/clothing/gloves/color/red - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer backpack_contents = list(/obj/item/a_gift/anything = 5) /datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index 08e8086d7abf..63eed36d6c1f 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -1,9 +1,12 @@ +/datum/outfit/job/plasmaman //yogs edit to prevent 2 boxes, TG plasmaman outfits are not subtypes of /job + box = null + /datum/outfit/job/plasmaman/bartender name = "Plasmaman Bartender" jobtype = /datum/job/bartender - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/fountainpen + pda_type = /obj/item/modular_computer/tablet/pda/preset/fountainpen/bartender head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -13,14 +16,13 @@ ears = /obj/item/radio/headset/headset_srv shoes = /obj/item/clothing/shoes/laceup glasses = /obj/item/clothing/glasses/sunglasses/reagent - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/cook name = "Plasmaman Cook" jobtype = /datum/job/cook - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/cook head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -28,14 +30,13 @@ uniform = /obj/item/clothing/under/plasmaman/chef suit = /obj/item/clothing/suit/toggle/chef ears = /obj/item/radio/headset/headset_srv - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/botanist name = "Plasmaman Botanist" jobtype = /datum/job/hydro - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/botanist head = /obj/item/clothing/head/helmet/space/plasmaman/blue r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -47,14 +48,13 @@ suit_store = /obj/item/plant_analyzer backpack = /obj/item/storage/backpack/botany satchel = /obj/item/storage/backpack/satchel/hyd - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/curator name = "Plasmaman Curator" jobtype = /datum/job/curator - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/fountainpen + pda_type = /obj/item/modular_computer/tablet/pda/preset/fountainpen/curator head = /obj/item/clothing/head/helmet/space/plasmaman/curator r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -65,14 +65,13 @@ r_pocket = /obj/item/key/displaycase l_pocket = /obj/item/laser_pointer accessory = /obj/item/clothing/accessory/pocketprotector/full - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/chaplain name = "Plasmaman Chaplain" jobtype = /datum/job/chaplain - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/chaplain head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -81,29 +80,26 @@ ears = /obj/item/radio/headset/headset_srv backpack = /obj/item/storage/backpack/cultpack satchel = /obj/item/storage/backpack/cultpack - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/janitor name = "Plasmaman Janitor" jobtype = /datum/job/janitor - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/janitor head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full mask = /obj/item/clothing/mask/breath uniform = /obj/item/clothing/under/plasmaman/janitor ears = /obj/item/radio/headset/headset_srv - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) - /datum/outfit/job/plasmaman/security name = "Plasmaman Security Officer" jobtype = /datum/job/officer - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/security head = /obj/item/clothing/head/helmet/space/plasmaman/security r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -118,14 +114,13 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/detective name = "Plasmaman Detective" jobtype = /datum/job/detective - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/security/detective head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -137,14 +132,13 @@ suit = /obj/item/clothing/suit/det_suit gloves = /obj/item/clothing/gloves/color/black l_pocket = /obj/item/toy/crayon/white - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/warden name = "Plasmaman Warden" jobtype = /datum/job/warden - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/security/warden head = /obj/item/clothing/head/helmet/space/plasmaman/security r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -160,15 +154,13 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) - /datum/outfit/job/plasmaman/cargo_tech name = "Plasmaman Cargo Technician" jobtype = /datum/job/cargo_tech - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/cargo head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -176,14 +168,13 @@ uniform = /obj/item/clothing/under/plasmaman/cargo ears = /obj/item/radio/headset/headset_cargo l_hand = /obj/item/export_scanner - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/quartermaster name = "Plasmaman Quartermaster" jobtype = /datum/job/qm - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/fountainpen + pda_type = /obj/item/modular_computer/tablet/pda/preset/cargo/quartermaster head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -193,14 +184,13 @@ shoes = /obj/item/clothing/shoes/sneakers/brown glasses = /obj/item/clothing/glasses/sunglasses l_hand = /obj/item/clipboard - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/miner name = "Plasmaman Shaft Miner" jobtype = /datum/job/mining - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/shaft_miner head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -214,16 +204,14 @@ backpack = /obj/item/storage/backpack/explorer satchel = /obj/item/storage/backpack/satchel/explorer duffelbag = /obj/item/storage/backpack/duffelbag - backpack_contents = list(/obj/item/storage/box/plasmaman/miner = 1,\ - /obj/item/reagent_containers/autoinjector/medipen/survival = 1) - + backpack_contents = list(/obj/item/reagent_containers/autoinjector/medipen/survival = 1) /datum/outfit/job/plasmaman/lawyer name = "Plasmaman Laywer" jobtype = /datum/job/lawyer - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/fountainpen + pda_type = /obj/item/modular_computer/tablet/pda/preset/fountainpen/lawyer head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -237,7 +225,6 @@ l_hand = /obj/item/storage/briefcase/lawyer l_pocket = /obj/item/laser_pointer r_pocket = /obj/item/clothing/accessory/lawyers_badge - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/doctor @@ -245,7 +232,7 @@ jobtype = /datum/job/doctor - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical head = /obj/item/clothing/head/helmet/space/plasmaman/blue r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -259,7 +246,6 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) gloves = /obj/item/clothing/gloves/color/latex/nitrile /datum/outfit/job/plasmaman/virologist @@ -267,7 +253,7 @@ jobtype = /datum/job/virologist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/viro head = /obj/item/clothing/head/helmet/space/plasmaman/viro r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -280,14 +266,13 @@ backpack = /obj/item/storage/backpack/virology satchel = /obj/item/storage/backpack/satchel/vir duffelbag = /obj/item/storage/backpack/duffelbag/med - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/chemist name = "Plasmaman Chemist" jobtype = /datum/job/chemist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/chem head = /obj/item/clothing/head/helmet/space/plasmaman/blue r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -300,14 +285,13 @@ backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/med - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/geneticist name = "Plasmaman Geneticist" jobtype = /datum/job/geneticist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/geneticist head = /obj/item/clothing/head/helmet/space/plasmaman/blue r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -321,15 +305,13 @@ backpack = /obj/item/storage/backpack/genetics satchel = /obj/item/storage/backpack/satchel/gen duffelbag = /obj/item/storage/backpack/duffelbag/med - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) - /datum/outfit/job/plasmaman/scientist name = "Plasmaman Scientist" jobtype = /datum/job/scientist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/scientist head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -340,14 +322,13 @@ suit = /obj/item/clothing/suit/toggle/labcoat/science backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/roboticist name = "Plasmaman Roboticist" jobtype = /datum/job/roboticist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/robo head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -358,7 +339,6 @@ suit = /obj/item/clothing/suit/toggle/labcoat backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) pda_slot = ITEM_SLOT_LPOCKET @@ -367,7 +347,7 @@ jobtype = /datum/job/engineer - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/engineering head = /obj/item/clothing/head/helmet/space/plasmaman/engineering uniform = /obj/item/clothing/under/plasmaman/engineering @@ -380,7 +360,6 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) pda_slot = ITEM_SLOT_LPOCKET @@ -389,7 +368,7 @@ jobtype = /datum/job/atmos - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/atmos + pda_type = /obj/item/modular_computer/tablet/pda/preset/atmos head = /obj/item/clothing/head/helmet/space/plasmaman/engineering uniform = /obj/item/clothing/under/plasmaman/atmospherics @@ -401,7 +380,6 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) pda_slot = ITEM_SLOT_LPOCKET @@ -410,7 +388,7 @@ jobtype = /datum/job/mime - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/mime + pda_type = /obj/item/modular_computer/tablet/pda/preset/mime head = /obj/item/clothing/head/helmet/space/plasmaman/mime uniform = /obj/item/clothing/under/plasmaman/mime @@ -421,14 +399,13 @@ suit = /obj/item/clothing/suit/suspenders backpack = /obj/item/storage/backpack/mime satchel = /obj/item/storage/backpack/mime - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/clown name = "Plasmaman Clown" jobtype = /datum/job/clown - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/clown + pda_type = /obj/item/modular_computer/tablet/pda/preset/clown head = /obj/item/clothing/head/helmet/space/plasmaman/clown uniform = /obj/item/clothing/under/plasmaman/clown @@ -440,14 +417,13 @@ backpack = /obj/item/storage/backpack/clown satchel = /obj/item/storage/backpack/clown duffelbag = /obj/item/storage/backpack/duffelbag/clown - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/sigtech name = "Plasmaman Network Admin" jobtype = /datum/job/network_admin - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/network_admin head = /obj/item/clothing/head/helmet/space/plasmaman/engineering r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -461,7 +437,6 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) pda_slot = ITEM_SLOT_LPOCKET @@ -475,8 +450,6 @@ mask = /obj/item/clothing/mask/breath backpack_contents = list(/obj/item/roller = 1,\ /obj/item/kitchen/knife/combat/survival = 1,\ - /obj/item/gps/mining = 1,\ - /obj/item/storage/box/plasmaman/miner = 1,\ /obj/item/reagent_containers/autoinjector/medipen/survival = 1,\ /obj/item/modular_computer/laptop/preset/paramedic/mining_medic = 1) belt = /obj/item/storage/belt/medical/mining @@ -498,13 +471,12 @@ jobtype = /datum/job/paramedic - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/paramed head = /obj/item/clothing/head/helmet/space/plasmaman/blue r_hand= /obj/item/tank/internals/plasmaman/belt/full mask = /obj/item/clothing/mask/breath - backpack_contents = list(/obj/item/storage/firstaid/regular = 1,\ - /obj/item/storage/box/plasmaman = 1) + backpack_contents = list(/obj/item/storage/firstaid/regular = 1) ears = /obj/item/radio/headset/headset_med uniform = /obj/item/clothing/under/plasmaman/medical suit = /obj/item/clothing/suit/toggle/labcoat/emt @@ -532,21 +504,19 @@ l_hand = /obj/item/storage/briefcase glasses = /obj/item/clothing/glasses/regular ears = /obj/item/radio/headset/headset_med - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/brigphysician name = "Plasmaman Brig Physician" jobtype = /datum/job/brigphysician - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/paramed belt = /obj/item/storage/belt/medical head = /obj/item/clothing/head/helmet/space/plasmaman/blue r_hand= /obj/item/tank/internals/plasmaman/belt/full mask = /obj/item/clothing/mask/breath - backpack_contents = list(/obj/item/roller = 1,\ - /obj/item/storage/box/plasmaman = 1) + backpack_contents = list(/obj/item/roller = 1) ears = /obj/item/radio/headset/headset_medsec glasses = /obj/item/clothing/glasses/hud/health/sunglasses shoes = /obj/item/clothing/shoes/jackboots @@ -569,8 +539,7 @@ ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/plasmaman/enviroslacks shoes = /obj/item/clothing/shoes/sneakers/black - backpack_contents = list(/obj/item/circuitboard/machine/paystand = 1,\ - /obj/item/storage/box/plasmaman = 1) + backpack_contents = list(/obj/item/circuitboard/machine/paystand = 1) /datum/outfit/job/plasmaman/tourist name = "Plasmaman Tourist" @@ -583,11 +552,10 @@ uniform = /obj/item/clothing/under/plasmaman shoes = /obj/item/clothing/shoes/sneakers/black ears = /obj/item/radio/headset - backpack_contents = list(/obj/item/camera_film, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c20, /obj/item/storage/box/plasmaman = 1) + backpack_contents = list(/obj/item/camera_film, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c20, /obj/item/stack/spacecash/c20) l_hand = /obj/item/camera l_pocket = /obj/item/camera_film r_pocket = /obj/item/camera_film - box = /obj/item/storage/box/plasmaman /datum/outfit/job/plasmaman/assistant name = "Plasmaman Assistant" @@ -600,7 +568,6 @@ uniform = /obj/item/clothing/under/plasmaman shoes = /obj/item/clothing/shoes/sneakers/black ears = /obj/item/radio/headset - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/artist name = "Plasmaman Artist" @@ -608,7 +575,7 @@ jobtype = /datum/job/artist id_type = /obj/item/card/id/silver - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/artist head = /obj/item/clothing/head/helmet/space/plasmaman r_hand= /obj/item/tank/internals/plasmaman/belt/full @@ -619,7 +586,6 @@ gloves = /obj/item/clothing/gloves/fingerless neck = /obj/item/clothing/neck/artist l_pocket = /obj/item/laser_pointer - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/ce name = "Plasmaman Chief Engineer" @@ -640,7 +606,6 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/rd name = "Plasmaman Research Director" @@ -660,7 +625,6 @@ suit = /obj/item/clothing/suit/toggle/labcoat/science backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/cmo name = "Plasmaman Chief Medical Officer" @@ -680,7 +644,6 @@ suit = /obj/item/clothing/suit/toggle/labcoat/cmo backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) /datum/outfit/job/plasmaman/hop name = "Plasmaman Head of Personnel" @@ -697,4 +660,3 @@ shoes = /obj/item/clothing/shoes/sneakers/brown ears = /obj/item/radio/headset/heads/hop glasses = /obj/item/clothing/glasses/hud/personnel - backpack_contents = list(/obj/item/storage/box/plasmaman = 1) diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 53040c44363e..b43c41157dbb 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -172,7 +172,7 @@ l_pocket = /obj/item/melee/transforming/energy/sword/saber l_hand = /obj/item/storage/secure/briefcase id = /obj/item/card/id/syndicate - belt = /obj/item/pda/heads + belt = /obj/item/modular_computer/tablet/pda/preset/syndicate /datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) var/obj/item/clothing/under/U = H.w_uniform diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index 1f12fc057245..1d81c2db9204 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -1,9 +1,8 @@ /datum/outfit/vr name = "Basic VR" - uniform = /obj/item/clothing/under/color/random + uniform = /obj/item/clothing/under/rank/cargotech shoes = /obj/item/clothing/shoes/sneakers/black - ears = /obj/item/radio/headset - id = /obj/item/card/id + id = /obj/item/card/id/no_bank /datum/outfit/vr/pre_equip(mob/living/carbon/human/H) H.dna.species.before_equip_job(null, H) @@ -12,6 +11,8 @@ var/obj/item/card/id/id = H.wear_id if (istype(id)) id.access |= get_all_accesses() + if(isplasmaman(H)) //sorry plasma people + H.set_species(/datum/species/human) /datum/outfit/vr/syndicate name = "Syndicate VR Operative - Basic" @@ -22,8 +23,8 @@ id = /obj/item/card/id/syndicate belt = /obj/item/gun/ballistic/automatic/pistol l_pocket = /obj/item/paper/fluff/vr/fluke_ops - backpack_contents = list(/obj/item/storage/box/syndie=1,\ - /obj/item/kitchen/knife/combat/survival) + box = /obj/item/storage/box/survival/syndie + backpack_contents = list(/obj/item/kitchen/knife/combat/survival) /datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H) . = ..() diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 253dd925eb8f..c4afb4db0534 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -1,6 +1,8 @@ /obj/item/clothing/shoes name = "shoes" icon = 'icons/obj/clothing/shoes.dmi' + lefthand_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' desc = "Comfortable-looking shoes." gender = PLURAL //Carn: for grammarically correct text-parsing var/chained = 0 @@ -9,7 +11,7 @@ slot_flags = ITEM_SLOT_FEET slowdown = SHOES_SLOWDOWN - + var/footprint_sprite = FOOTPRINT_SPRITE_SHOES var/offset = 0 var/equipped_before_drop = FALSE var/xenoshoe = NO_DIGIT // Check for if shoes can be worn by straight legs (NO_DIGIT) which is default, both / hybrid (EITHER_STYLE), or digitigrade only (YES_DIGIT) @@ -37,15 +39,23 @@ return(BRUTELOSS) /obj/item/clothing/shoes/worn_overlays(isinhands = FALSE) - . = list() - if(!isinhands) - if(damaged_clothes) - . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") - if(HAS_BLOOD_DNA(src)) - var/mutable_appearance/bloody_shoes - bloody_shoes = mutable_appearance('icons/effects/blood.dmi', "shoeblood") - bloody_shoes.color = get_blood_dna_color(return_blood_DNA()) - . += bloody_shoes + . = ..() + if(isinhands) + return + + if(damaged_clothes) + . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") + + if(!HAS_BLOOD_DNA(src)) + return + + var/mutable_appearance/bloody_shoes + if(clothing_flags & LARGE_WORN_ICON) + bloody_shoes = mutable_appearance('icons/effects/64x64.dmi', "shoeblood_large") + else + bloody_shoes = mutable_appearance('icons/effects/blood.dmi', "shoeblood") + bloody_shoes.color = get_blood_dna_color(return_blood_DNA()) + . += bloody_shoes /obj/item/clothing/shoes/equipped(mob/user, slot) if(adjusted) diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 7ded51e057f3..b5c9210563ab 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -1,9 +1,18 @@ /obj/item/clothing/shoes/sneakers dying_key = DYE_REGISTRY_SNEAKERS + icon_state = "sneakers" + item_state = "sneakers_back" + lefthand_file = 'icons/mob/inhands/clothing/shoes_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/shoes_righthand.dmi' + greyscale_colors = "#2d2d33#ffffff" + greyscale_config = /datum/greyscale_config/sneakers + greyscale_config_worn = /datum/greyscale_config/sneakers_worn + greyscale_config_inhand_left = /datum/greyscale_config/sneakers_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/sneakers_inhand_right + flags_1 = IS_PLAYER_COLORABLE_1 /obj/item/clothing/shoes/sneakers/black name = "black shoes" - icon_state = "black" desc = "A pair of black shoes." custom_price = 20 @@ -15,36 +24,32 @@ /obj/item/clothing/shoes/sneakers/brown name = "brown shoes" desc = "A pair of brown shoes." - icon_state = "brown" + greyscale_colors = "#472c21#ffffff" /obj/item/clothing/shoes/sneakers/blue name = "blue shoes" - icon_state = "blue" + greyscale_colors = "#4f88df#ffffff" /obj/item/clothing/shoes/sneakers/green name = "green shoes" - icon_state = "green" + greyscale_colors = "#3bca5a#ffffff" /obj/item/clothing/shoes/sneakers/yellow name = "yellow shoes" - icon_state = "yellow" + greyscale_colors = "#deb63d#ffffff" /obj/item/clothing/shoes/sneakers/purple name = "purple shoes" - icon_state = "purple" - -/obj/item/clothing/shoes/sneakers/brown - name = "brown shoes" - icon_state = "brown" + greyscale_colors = "#7e1980#ffffff" /obj/item/clothing/shoes/sneakers/red name = "red shoes" desc = "Stylish red shoes." - icon_state = "red" + greyscale_colors = "#a52f29#ffffff" /obj/item/clothing/shoes/sneakers/white name = "white shoes" - icon_state = "white" + greyscale_colors = "#ffffff#ffffff" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 0, ACID = 0) /obj/item/clothing/shoes/sneakers/rainbow @@ -52,16 +57,28 @@ desc = "Very colorful shoes." icon_state = "rain_bow" + greyscale_colors = null + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + flags_1 = NONE + /obj/item/clothing/shoes/sneakers/orange name = "orange shoes" - icon_state = "orange" + greyscale_colors = "#d15b1b#ffffff" + greyscale_config = /datum/greyscale_config/sneakers_orange + greyscale_config_worn = /datum/greyscale_config/sneakers_orange_worn + greyscale_config_inhand_left = /datum/greyscale_config/sneakers_orange_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/sneakers_orange_inhand_right + flags_1 = NONE /obj/item/clothing/shoes/sneakers/orange/attack_self(mob/user) - if (src.chained) - src.chained = null - src.slowdown = SHOES_SLOWDOWN + if (chained) + chained = FALSE + slowdown = SHOES_SLOWDOWN new /obj/item/restraints/handcuffs( user.loc ) - src.icon_state = "orange" + update_icon() return /obj/item/clothing/shoes/sneakers/orange/attackby(obj/H, loc, params) @@ -69,15 +86,15 @@ // Note: not using istype here because we want to ignore all subtypes if (H.type == /obj/item/restraints/handcuffs && !chained) qdel(H) - src.chained = 1 - src.slowdown = 15 - src.icon_state = "orange1" + chained = TRUE + slowdown = 15 + update_appearance(UPDATE_ICON) return /obj/item/clothing/shoes/sneakers/orange/allow_attack_hand_drop(mob/user) if(ishuman(user)) var/mob/living/carbon/human/C = user - if(C.shoes == src && chained == 1) + if(C.shoes == src && chained) to_chat(user, span_warning("You need help taking these off!")) return FALSE return ..() @@ -86,8 +103,36 @@ var/mob/m = usr if(ishuman(m)) var/mob/living/carbon/human/c = m - if(c.shoes == src && chained == 1) + if(c.shoes == src && chained) to_chat(c, span_warning("You need help taking these off!")) return return ..() +/obj/item/clothing/shoes/sneakers/orange/update_icon_state() + . = ..() + if(chained) + icon_state = item_state = "sneakers_chained" + else + icon_state = initial(icon_state) + item_state = initial(item_state) + update_greyscale() + +/obj/item/clothing/shoes/sneakers/mime + name = "mime shoes" + greyscale_colors = "#ffffff#ffffff" + +/obj/item/clothing/shoes/sneakers/marisa + desc = "A pair of magic black shoes." + name = "magic shoes" + greyscale_colors = "#2d2d33#ffffff" + greyscale_config = /datum/greyscale_config/sneakers_marisa + greyscale_config_worn = /datum/greyscale_config/sneakers_marisa/worn + strip_delay = 5 + equip_delay_other = 50 +// can_be_tied = FALSE + resistance_flags = FIRE_PROOF | ACID_PROOF + +/obj/item/clothing/shoes/sneakers/cyborg + name = "cyborg boots" + desc = "Shoes for a cyborg costume." + greyscale_colors = "#4e4e4e#4e4e4e" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 95cd0b5ba2c1..ac8d322725e1 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,10 +1,6 @@ /obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking SEND_SIGNAL(src, COMSIG_SHOES_STEP_ACTION) -/obj/item/clothing/shoes/sneakers/mime - name = "mime shoes" - icon_state = "mime" - /obj/item/clothing/shoes/combat //basic syndicate combat boots for nuke ops and mob corpses name = "combat boots" desc = "High speed, low drag combat boots." @@ -280,41 +276,62 @@ /obj/item/clothing/shoes/wheelys name = "Wheely-Heels" desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel - icon_state = "wheelys" - item_state = "wheelys" + item_state = "sneakers_back" + icon_state = "sneakers" + greyscale_colors = "#545454#ffffff" + greyscale_config = /datum/greyscale_config/sneakers_wheelys + greyscale_config_inhand_left = /datum/greyscale_config/sneakers_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/sneakers_inhand_right + mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/feet.dmi' + worn_icon_state = "wheelys" + worn_x_dimension = 64 + worn_y_dimension = 64 + clothing_flags = LARGE_WORN_ICON actions_types = list(/datum/action/item_action/wheelys) - var/wheelToggle = FALSE //False means wheels are not popped out - var/obj/vehicle/ridden/scooter/wheelys/W + ///False means wheels are not popped out + var/wheelToggle = FALSE + ///The vehicle associated with the shoes + var/obj/vehicle/ridden/scooter/wheelys/wheels = /obj/vehicle/ridden/scooter/wheelys /obj/item/clothing/shoes/wheelys/Initialize(mapload) . = ..() - W = new /obj/vehicle/ridden/scooter/wheelys(null) + AddElement(/datum/element/update_icon_updates_onmob) + wheels = new wheels(null) + wheels.link_shoes(src) /obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action) if(!isliving(user)) return if(!istype(user.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/wheelys)) - to_chat(user, span_warning("You must be wearing the wheely-heels to use them!")) + balloon_alert(user, "must be worn!") return - if(!(W.is_occupant(user))) + if(!(wheels.is_occupant(user))) wheelToggle = FALSE if(wheelToggle) - W.unbuckle_mob(user) + wheels.unbuckle_mob(user) wheelToggle = FALSE return - W.forceMove(get_turf(user)) - W.buckle_mob(user) + wheels.forceMove(get_turf(user)) + wheels.buckle_mob(user) wheelToggle = TRUE /obj/item/clothing/shoes/wheelys/dropped(mob/user) if(wheelToggle) - W.unbuckle_mob(user) + wheels.unbuckle_mob(user) wheelToggle = FALSE - ..() + return ..() + +/obj/item/clothing/shoes/wheelys/proc/toggle_wheels(status) + if (status) + worn_icon_state = "[initial(worn_icon_state)]-on" + else + worn_icon_state = "[initial(worn_icon_state)]" + playsound(src, 'sound/weapons/tap.ogg', 10, TRUE) + update_appearance() /obj/item/clothing/shoes/wheelys/Destroy() - QDEL_NULL(W) - . = ..() + QDEL_NULL(wheels) + return ..() /obj/item/clothing/shoes/kindleKicks name = "Kindle Kicks" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index d08b696c283c..9a020de8b64a 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -27,6 +27,8 @@ desc = "A suit that protects against low pressure environments. Has a big N on the back." icon_state = "space" item_state = "space" + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.01 clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 3e2d7808d15d..4b27e2ae28cb 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -1009,7 +1009,7 @@ C.update_inv_wear_suit() /obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands) - . = list() + . = ..() if(!isinhands) . += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) @@ -1251,3 +1251,57 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF slowdown = 0 + +/obj/item/clothing/head/helmet/space/hardsuit/synth + name = "\improper synthetic worksuit helmet" + desc = "An integrated helmet that provides some level of resistance, to assist in hostile environments." + icon = 'icons/mob/clothing/head/head.dmi' + icon_state = "hardsuit0-synth" + item_state = "centcom" + w_class = WEIGHT_CLASS_BULKY + clothing_flags = THICKMATERIAL | STOPSPRESSUREDAMAGE + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + armor = list(MELEE = 10, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 100, FIRE = 10, ACID = 15) + hardsuit_type = "synth" + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | INDESTRUCTIBLE | FREEZE_PROOF + +/obj/item/clothing/head/helmet/space/hardsuit/synth/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SYNTHETIC_TRAIT) + +/obj/item/clothing/suit/space/hardsuit/synth + name = "\improper synthetic worksuit" + desc = "An integrated suit that provides some level of resistance, to assist in hostile environments." + icon = 'icons/mob/clothing/suit/suit.dmi' + icon_state = "synth_suit" + item_state = "centcom" + w_class = WEIGHT_CLASS_BULKY + body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + clothing_flags = STOPSPRESSUREDAMAGE | STOPSPRESSUREDAMAGE + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 25, BIO = 25, RAD = 100, FIRE = 10, ACID = 25) + var/evil = FALSE + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/synth + slowdown = 0 + + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | INDESTRUCTIBLE | FREEZE_PROOF + +/obj/item/clothing/suit/space/hardsuit/synth/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, SYNTHETIC_TRAIT) + +/obj/item/clothing/suit/space/hardsuit/synth/update_icon_state() + . = ..() + if(evil) + icon_state = "synth_suit_evil" + else + icon_state = "synth_suit" + + var/mob/living/carbon/human/user = loc + if(user && istype(user)) + user.update_inv_wear_suit() diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 8582b6063e60..3fda13a2bdcd 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -1,6 +1,8 @@ /obj/item/clothing/suit - icon = 'icons/obj/clothing/suits/suits.dmi' name = "suit" + icon = 'icons/obj/clothing/suits/suits.dmi' + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' var/fire_resist = T0C+100 allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/tank/internals/ipc_coolant) armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0) @@ -22,7 +24,7 @@ return ..() /obj/item/clothing/suit/worn_overlays(isinhands = FALSE) - . = list() + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 8b39d4c86061..5a7b1e1ddeae 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -539,3 +539,4 @@ slowdown_set = 0.4 // Very slow armor = list(MELEE = 55, BULLET = 60, LASER = 60, ENERGY = 40, BOMB = 40, BIO = 0, RAD = 0, FIRE = 65, ACID = 75, WOUND = 50) //Walking tank partial_coverage = LEGS|ARMS + diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 4ebf2f878af5..e0fa92a38ef7 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -284,6 +284,6 @@ C.update_inv_wear_suit() /obj/item/clothing/suit/wizrobe/armor/worn_overlays(isinhands) - . = list() + . = ..() if(!isinhands) . += mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 82cad43f267f..45e265f8742e 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -1,6 +1,8 @@ /obj/item/clothing/under - icon = 'icons/obj/clothing/uniforms.dmi' name = "under" + icon = 'icons/obj/clothing/uniforms.dmi' + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' body_parts_covered = CHEST|GROIN|LEGS|ARMS slot_flags = ITEM_SLOT_ICLOTHING armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 5, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5) @@ -22,7 +24,7 @@ tearable = TRUE //all jumpsuits can be torn down and used for cloth in an emergency | yogs /obj/item/clothing/under/worn_overlays(isinhands = FALSE) - . = list() + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") @@ -107,6 +109,9 @@ attached_accessory.on_clothing_equip(src, user) if(attached_accessory.above_suit) H.update_inv_wear_suit() + if(is_synth(user) && has_sensor) + to_chat(user, span_notice("Suit sensors disabled due to non-compatible user.")) + sensor_mode = SENSOR_OFF /obj/item/clothing/under/dropped(mob/user) if(attached_accessory) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index b876a8275d52..c2fff61bba84 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -91,6 +91,8 @@ desc = "For some classy, murderous fun." icon_state = "waistcoat" item_state = "waistcoat" + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' minimize_when_attached = FALSE attachment_slot = null @@ -99,6 +101,8 @@ desc = "The best part of a maid costume." icon_state = "maidapron" item_state = "maidapron" + lefthand_file = 'icons/mob/inhands/clothing/suits_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing/suits_righthand.dmi' minimize_when_attached = FALSE attachment_slot = null @@ -428,3 +432,70 @@ attachment_slot = null above_suit = TRUE above_suit_adjustable = TRUE + + +////////////// +//Pride Pins// +////////////// + +/obj/item/clothing/accessory/pride + name = "pride pin" + desc = "A Nanotrasen Diversity & Inclusion Center-sponsored holographic pin to show off your sexuality, reminding the crew of their unwavering commitment to equity, diversity, and inclusion!" + icon_state = "pride" + above_suit_adjustable = TRUE + var/static/list/pride_reskins = list( + "Rainbow Pride" = list( + "icon" = "pride_rainbow", + "info" = "A colorful striped rainbow that represents diversity and Gay Pride, pride in same-gender love!"), + "Bisexual Pride" = list( + "icon" = "pride_bi", + "info" = "Purple, dark pink and dark blue stripes that represent Bisexual Pride, pride in loving both binary genders!"), + "Pansexual Pride" = list( + "icon" = "pride_pan", + "info" = "Yellow, pink and blue stripes that represent Pansexual Pride, pride in loving regardless of sex or gender!"), + "Asexual Pride" = list( + "icon" = "pride_ace", + "info" = "Black, grey, white and purple stripes that represent Asexual Pride, pride in nonsexual love!"), + "Non-binary Pride" = list( + "icon" = "pride_enby", + "info" = "Yellow, white, purple and black stripes that represent Non-Binary pride, pride in identifying as a Non-Binary gender!"), + "Transgender Pride"= list( + "icon" = "pride_trans", + "info" = "Blue, pink and white stripes that represent Transgender pride, pride in transitioning genders!"), + "Intersex Pride" = list( + "icon" = "pride_intersex", + "info" = "A yellow background with a disctint purple circle that represents Intersex pride, pride in atypical sex characteristics!"), + "Lesbian Pride" = list( + "icon" = "pride_lesbian", + "info" = "Orange and pink shaded stripes that represent Lesbian pride, pride in same-gender love among women!"), + "Gay Pride" = list( + "icon" = "pride_gay", + "info" = "Navy and turquoise shaded stripes that represent Gay pride, pride in same-gender love among men!"), + //meme pins under this + "Ian Pride" = list( //we love ian + "icon" = "pride_ian", + "info" = "A orange corgi, pride in the HoP's beloved pet!"), + "Void Pride" = list( //darkness antag + "icon" = "pride", + "info" = "Nothing, pride in NOTHING!!!"), + "Suspicious Pride Pin" = list( //syndicate + "icon" = "pride_suspicious", + "info" = "A black S on a red banner, pride in chaos!"), + "Grey Pride" = list( //assistants + "icon" = "pride_grey", + "info" = "A robust toolbox over a grey background, pride in what is stationwide!"), + "Command Pride" = list( + "icon" = "pride_command", + "info" = "A blue background with an elaborate white trim, pride in your superiors!") + ) + +/obj/item/clothing/accessory/pride/attack_self(mob/user) + . = ..() + var/list/radial_menu = list() + for(var/pin_type in pride_reskins) + var/datum/radial_menu_choice/choice = new() + choice.image = icon(icon, pride_reskins[pin_type]["icon"]) + choice.info = pride_reskins[pin_type]["info"] + radial_menu[pin_type] = choice + var/Pin = show_radial_menu(user, user, radial_menu, tooltips = TRUE) + icon_state = Pin ? pride_reskins[Pin]["icon"] : initial(icon_state) diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 553db2d82ace..32eb5096678d 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -1,6 +1,17 @@ /obj/item/clothing/under/color + name = "jumpsuit" desc = "A standard issue colored jumpsuit. Variety is the spice of life!" dying_key = DYE_REGISTRY_UNDER + greyscale_colors = "#3f3f3f" + greyscale_config = /datum/greyscale_config/jumpsuit + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_inhand_right + greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn + icon = 'icons/obj/clothing/under/color.dmi' + icon_state = "jumpsuit" + item_state = "jumpsuit" + worn_icon_state = "jumpsuit" + mob_overlay_icon = 'icons/mob/clothing/uniform/color.dmi' mutantrace_variation = MUTANTRACE_VARIATION /obj/item/clothing/under/skirt/color @@ -8,12 +19,22 @@ body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP + greyscale_colors = "#3f3f3f" + greyscale_config = /datum/greyscale_config/jumpsuit + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_inhand_right + greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn + icon = 'icons/obj/clothing/under/color.dmi' + icon_state = "jumpskirt" + item_state = "jumpsuit" + worn_icon_state = "jumpskirt" + mob_overlay_icon = 'icons/mob/clothing/uniform/color.dmi' /obj/item/clothing/under/color/random icon_state = "random_jumpsuit" /obj/item/clothing/under/color/random/Initialize(mapload) - ..() + . = ..() var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/glorf - /obj/item/clothing/under/color/black/ghost) if(ishuman(loc)) var/mob/living/carbon/human/H = loc @@ -26,7 +47,7 @@ icon_state = "random_jumpsuit" //Skirt variant needed /obj/item/clothing/under/skirt/color/random/Initialize(mapload) - ..() + . = ..() var/obj/item/clothing/under/skirt/color/C = pick(subtypesof(/obj/item/clothing/under/skirt/color) - /obj/item/clothing/under/skirt/color/random) if(ishuman(loc)) var/mob/living/carbon/human/H = loc @@ -37,14 +58,10 @@ /obj/item/clothing/under/color/black name = "black jumpsuit" - icon_state = "black" - item_state = "bl_suit" resistance_flags = NONE /obj/item/clothing/under/skirt/color/black name = "black jumpskirt" - icon_state = "black_skirt" - item_state = "bl_suit" /obj/item/clothing/under/color/black/ghost item_flags = DROPDEL @@ -56,18 +73,24 @@ /obj/item/clothing/under/color/grey name = "grey jumpsuit" desc = "A tasteful grey jumpsuit that reminds you of the good old days." - icon_state = "grey" - item_state = "gy_suit" + greyscale_colors = "#b3b3b3" /obj/item/clothing/under/skirt/color/grey name = "grey jumpskirt" desc = "A tasteful grey jumpskirt that reminds you of the good old days." - icon_state = "grey_skirt" - item_state = "gy_suit" + greyscale_colors = "#b3b3b3" /obj/item/clothing/under/color/grey/glorf name = "ancient jumpsuit" desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade." + icon_state = "grey_ancient" + item_state = "gy_suit" + worn_icon_state = "grey_ancient" + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + can_adjust = FALSE /obj/item/clothing/under/color/grey/glorf/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) owner.forcesay(GLOB.hit_appends) @@ -75,150 +98,138 @@ /obj/item/clothing/under/color/blue name = "blue jumpsuit" - icon_state = "blue" - item_state = "b_suit" + greyscale_colors = "#52aecc" /obj/item/clothing/under/skirt/color/blue name = "blue jumpskirt" - icon_state = "blue_skirt" - item_state = "b_suit" + greyscale_colors = "#52aecc" /obj/item/clothing/under/color/green name = "green jumpsuit" - icon_state = "green" - item_state = "g_suit" + greyscale_colors = "#9ed63a" /obj/item/clothing/under/skirt/color/green name = "green jumpskirt" - icon_state = "green_skirt" - item_state = "g_suit" + greyscale_colors = "#9ed63a" /obj/item/clothing/under/color/orange name = "orange jumpsuit" desc = "Don't wear this near paranoid security officers." - icon_state = "orange" - item_state = "o_suit" + greyscale_colors = "#ff8c19" /obj/item/clothing/under/skirt/color/orange name = "orange jumpskirt" - icon_state = "orange_skirt" - item_state = "o_suit" + greyscale_colors = "#ff8c19" /obj/item/clothing/under/color/pink name = "pink jumpsuit" - icon_state = "pink" desc = "Just looking at this makes you feel fabulous." - item_state = "p_suit" + greyscale_colors = "#ffa69b" /obj/item/clothing/under/skirt/color/pink name = "pink jumpskirt" - icon_state = "pink_skirt" - item_state = "p_suit" + greyscale_colors = "#ffa69b" /obj/item/clothing/under/color/red name = "red jumpsuit" - icon_state = "red" - item_state = "r_suit" + greyscale_colors = "#eb0c07" /obj/item/clothing/under/skirt/color/red name = "red jumpskirt" - icon_state = "red_skirt" - item_state = "r_suit" + greyscale_colors = "#eb0c07" /obj/item/clothing/under/color/white name = "white jumpsuit" - icon_state = "white" - item_state = "w_suit" + greyscale_colors = "#ffffff" /obj/item/clothing/under/skirt/color/white name = "white jumpskirt" - icon_state = "white_skirt" - item_state = "w_suit" + greyscale_colors = "#ffffff" /obj/item/clothing/under/color/yellow name = "yellow jumpsuit" - icon_state = "yellow" - item_state = "y_suit" + greyscale_colors = "#ffe14d" /obj/item/clothing/under/skirt/color/yellow name = "yellow jumpskirt" - icon_state = "yellow_skirt" - item_state = "y_suit" + greyscale_colors = "#ffe14d" /obj/item/clothing/under/color/darkblue name = "darkblue jumpsuit" - icon_state = "darkblue" - item_state = "b_suit" + greyscale_colors = "#3285ba" /obj/item/clothing/under/skirt/color/darkblue name = "darkblue jumpskirt" - icon_state = "darkblue_skirt" - item_state = "b_suit" + greyscale_colors = "#3285ba" /obj/item/clothing/under/color/teal name = "teal jumpsuit" - icon_state = "teal" - item_state = "b_suit" + greyscale_colors = "#77f3b7" /obj/item/clothing/under/skirt/color/teal name = "teal jumpskirt" - icon_state = "teal_skirt" - item_state = "b_suit" - + greyscale_colors = "#77f3b7" /obj/item/clothing/under/color/lightpurple name = "purple jumpsuit" - icon_state = "lightpurple" - item_state = "p_suit" + greyscale_colors = "#9f70cc" /obj/item/clothing/under/skirt/color/lightpurple name = "lightpurple jumpskirt" - icon_state = "lightpurple_skirt" - item_state = "p_suit" + greyscale_colors = "#9f70cc" /obj/item/clothing/under/color/darkgreen name = "darkgreen jumpsuit" - icon_state = "darkgreen" - item_state = "g_suit" + greyscale_colors = "#6fbc22" /obj/item/clothing/under/skirt/color/darkgreen name = "darkgreen jumpskirt" - icon_state = "darkgreen_skirt" - item_state = "g_suit" + greyscale_colors = "#6fbc22" /obj/item/clothing/under/color/lightbrown name = "lightbrown jumpsuit" - icon_state = "lightbrown" - item_state = "lb_suit" + greyscale_colors = "#c59431" /obj/item/clothing/under/skirt/color/lightbrown name = "lightbrown jumpskirt" - icon_state = "lightbrown_skirt" - item_state = "lb_suit" + greyscale_colors = "#c59431" /obj/item/clothing/under/color/brown name = "brown jumpsuit" - icon_state = "brown" - item_state = "lb_suit" + greyscale_colors = "#a17229" /obj/item/clothing/under/skirt/color/brown name = "brown jumpskirt" - icon_state = "brown_skirt" - item_state = "lb_suit" + greyscale_colors = "#a17229" /obj/item/clothing/under/color/maroon name = "maroon jumpsuit" - icon_state = "maroon" - item_state = "r_suit" + greyscale_colors = "#cc295f" /obj/item/clothing/under/skirt/color/maroon name = "maroon jumpskirt" - icon_state = "maroon_skirt" - item_state = "r_suit" + greyscale_colors = "#cc295f" /obj/item/clothing/under/color/rainbow name = "rainbow jumpsuit" desc = "A multi-colored jumpsuit!" icon_state = "rainbow" item_state = "rainbow" + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null + can_adjust = FALSE + flags_1 = NONE + +/obj/item/clothing/under/color/jumpskirt/rainbow + name = "rainbow jumpskirt" + desc = "A multi-colored jumpskirt!" + icon_state = "rainbow_skirt" + item_state = "rainbow_skirt" + greyscale_config = null + greyscale_config_inhand_left = null + greyscale_config_inhand_right = null + greyscale_config_worn = null can_adjust = FALSE + flags_1 = NONE diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 78fbc7bae03f..eed54ddcee88 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -67,8 +67,13 @@ /obj/item/clothing/under/rank/prisoner name = "prison jumpsuit" desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." - icon_state = "prisoner" - item_state = "o_suit" + icon_state = "jumpsuit" + item_state = "jumpsuit" + greyscale_colors = "#ff8300" + greyscale_config = /datum/greyscale_config/jumpsuit_prison + greyscale_config_worn = /datum/greyscale_config/jumpsuit_prison_worn + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_prison_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_prison_inhand_right has_sensor = LOCKED_SENSORS sensor_mode = SENSOR_COORDS random_sensor = FALSE @@ -77,8 +82,12 @@ /obj/item/clothing/under/rank/prisoner/skirt name = "prison jumpskirt" desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position." - icon_state = "prisoner_skirt" - item_state = "o_suit" + icon_state = "jumpskirt" + greyscale_colors = "#ff8300" + greyscale_config = /datum/greyscale_config/jumpsuit_prison + greyscale_config_worn = /datum/greyscale_config/jumpsuit_prison_worn + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_prison_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_prison_inhand_right body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP @@ -202,7 +211,7 @@ /obj/item/clothing/under/cloud name = "cloud" - desc = "cloud" + desc = "Cloud." icon_state = "cloud" can_adjust = FALSE @@ -773,8 +782,14 @@ /obj/item/clothing/under/durathread name = "durathread jumpsuit" desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer." - icon_state = "durathread" - item_state = "durathread" + icon = 'icons/obj/clothing/under/color.dmi' + icon_state = "jumpsuit" + mob_overlay_icon = 'icons/mob/clothing/uniform/color.dmi' + greyscale_colors = "#8291a1" + greyscale_config = /datum/greyscale_config/jumpsuit + greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_inhand_left + greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_inhand_right + greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn can_adjust = FALSE armor = list(MELEE = 10, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5) mutantrace_variation = MUTANTRACE_VARIATION diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 508e998206e4..8755d6201bca 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -67,6 +67,8 @@ /datum/bank_account/proc/payday(amt_of_paychecks, free = FALSE) var/money_to_transfer = account_job.paycheck * amt_of_paychecks + if(!money_to_transfer) + return TRUE if(free) adjust_money(money_to_transfer) return TRUE diff --git a/code/modules/economy/pay_stand.dm b/code/modules/economy/pay_stand.dm index 1e32fe3adb1e..565956699d4e 100644 --- a/code/modules/economy/pay_stand.dm +++ b/code/modules/economy/pay_stand.dm @@ -1,6 +1,6 @@ /obj/machinery/paystand name = "unregistered pay stand" - desc = "an unregistered pay stand" + desc = "An unregistered pay stand, ready to be linked to an account." icon = 'icons/obj/economy.dmi' icon_state = "card_scanner" anchored = TRUE diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index a4559db26221..5050212bd8ca 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -68,9 +68,9 @@ return FALSE if(ispath(typepath, /datum/round_event/ghost_role) && !(GLOB.ghost_role_flags & GHOSTROLE_MIDROUND_EVENT)) return FALSE - if(GLOB.security_level > max_alert) + if(SSsecurity_level.get_current_level_as_number() > max_alert) return FALSE - if(GLOB.security_level < min_alert) + if(SSsecurity_level.get_current_level_as_number() < min_alert) return FALSE var/datum/game_mode/dynamic/dynamic = SSticker.mode diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm index 16321f29a003..a527d8a860ff 100644 --- a/code/modules/events/fugitive_spawning.dm +++ b/code/modules/events/fugitive_spawning.dm @@ -81,7 +81,7 @@ S.equipOutfit(/datum/outfit/waldo) if("synth") S.equipOutfit(/datum/outfit/synthetic) - S.set_species(/datum/species/synth) + S.set_species(/datum/species/ipc/self) message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.") log_game("[key_name(S)] was spawned as a Fugitive by an event.") spawned_mobs += S diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index bf23415bc2a2..95d015ce2f63 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -190,7 +190,7 @@ STOP_PROCESSING(SSobj,src) /obj/machinery/shuttle_scrambler/update_icon_state() - icon_state = active ? "dominator-Blue" : "dominator" + icon_state = active ? "dominator-red" : "dominator" return ..() /obj/machinery/shuttle_scrambler/Destroy() diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index a94d9818e829..dbc875a3da2e 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -185,7 +185,7 @@ if(prob(25)) // chance of some fun effects if(prob(20)) A.visible_message(span_userdanger("[A] overloads and blows up!")) - A.obj_break() + A.atom_break() explosion(A, 0, 0, 2, flame_range=3) else A.visible_message(span_userdanger("[A] overloads and makes a huge arc!")) diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 28b1f2d0d176..7fef0dcf9ec2 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -90,8 +90,8 @@ continue if(!GLOB.emergency_access) make_maint_all_access() - else if(GLOB.security_level < SEC_LEVEL_RED) - set_security_level(SEC_LEVEL_RED) + else if(SSsecurity_level.get_current_level_as_number() < SEC_LEVEL_RED) + SSsecurity_level.set_level(SEC_LEVEL_RED) diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm index 7fa850c78943..4ed74ae0b931 100644 --- a/code/modules/events/shuttle_catastrophe.dm +++ b/code/modules/events/shuttle_catastrophe.dm @@ -37,5 +37,5 @@ SSshuttle.load_template(new_shuttle) SSshuttle.existing_shuttle = SSshuttle.emergency SSshuttle.emergency.name = new_shuttle.name - SSshuttle.action_load(new_shuttle) + SSshuttle.action_load(new_shuttle, replace = TRUE) log_game("Shuttle Catastrophe set a new shuttle, [new_shuttle.name].") diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index c6dcda3ad61a..9cce3d6b51fd 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -242,7 +242,7 @@ if(holder.energy) holder.density = TRUE holder.max_integrity = 100 - holder.obj_integrity = holder.max_integrity + holder.update_integrity(holder.max_integrity) /datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage) if(I.is_sharp()) @@ -284,6 +284,14 @@ /obj/structure/spacevine/Initialize(mapload) . = ..() add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + RegisterSignal(src, COMSIG_ATOM_CLEAVE_ATTACK, PROC_REF(on_cleave_attack)) + +/obj/structure/spacevine/proc/on_cleave_attack() + return ATOM_ALLOW_CLEAVE_ATTACK // vines don't have density but should still be cleavable /obj/structure/spacevine/examine(mob/user) . = ..() @@ -344,8 +352,7 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) -/obj/structure/spacevine/Crossed(atom/movable/AM) - . = ..() +/obj/structure/spacevine/proc/on_entered(datum/source, atom/movable/AM, ...) if(!isliving(AM)) return for(var/datum/spacevine_mutation/SM in mutations) diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index f951997676f7..c2df58cdf4ff 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -25,9 +25,6 @@ /mob/living/simple_animal/hostile/carp/ranged name = "magicarp" desc = "50% magic, 50% carp, 100% horrible." - icon_state = "magicarp" - icon_living = "magicarp" - icon_dead = "magicarp_dead" icon_gib = "magicarp_gib" ranged = 1 retreat_distance = 2 @@ -36,7 +33,8 @@ projectilesound = 'sound/weapons/emitter.ogg' maxHealth = 50 health = 50 - gold_core_spawnable = NO_SPAWN //yogs - fuck this shit + gold_core_spawnable = NO_SPAWN + greyscale_config = /datum/greyscale_config/carp_magic random_color = FALSE var/allowed_projectile_types = list(/obj/projectile/magic/animate, /obj/projectile/magic/resurrection, /obj/projectile/magic/death, /obj/projectile/magic/teleport, /obj/projectile/magic/door, /obj/projectile/magic/fireball, @@ -44,7 +42,7 @@ /mob/living/simple_animal/hostile/carp/ranged/Initialize(mapload) projectiletype = pick(allowed_projectile_types) - . = ..() + return ..() /mob/living/simple_animal/hostile/carp/ranged/wizard faction = list("wizard") diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 9daaf5143401..af711de9902e 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -1104,13 +1104,19 @@ GLOBAL_LIST_INIT(hallucination_list, list( /obj/effect/hallucination/danger/lava name = "lava" +/obj/effect/hallucination/danger/lava/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/effect/hallucination/danger/lava/show_icon() image = image('icons/turf/floors/lava.dmi',src,"smooth",TURF_LAYER) if(target.client) target.client.images += image -/obj/effect/hallucination/danger/lava/Crossed(atom/movable/AM) - . = ..() +/obj/effect/hallucination/danger/lava/proc/on_entered(datum/source, atom/movable/AM, ...) if(AM == target) target.adjustStaminaLoss(20) new /datum/hallucination/fire(target) @@ -1118,13 +1124,19 @@ GLOBAL_LIST_INIT(hallucination_list, list( /obj/effect/hallucination/danger/chasm name = "chasm" +/obj/effect/hallucination/danger/chasm/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/effect/hallucination/danger/chasm/show_icon() image = image('icons/turf/floors/chasms.dmi',src,"smooth",TURF_LAYER) if(target.client) target.client.images += image -/obj/effect/hallucination/danger/chasm/Crossed(atom/movable/AM) - . = ..() +/obj/effect/hallucination/danger/chasm/proc/on_entered(datum/source, atom/movable/AM, ...) if(AM == target) if(istype(target, /obj/effect/dummy/phased_mob) || istype(target, /obj/effect/dummy/crawling)) return @@ -1139,6 +1151,10 @@ GLOBAL_LIST_INIT(hallucination_list, list( /obj/effect/hallucination/danger/anomaly/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/effect/hallucination/danger/anomaly/process(delta_time) if(DT_PROB(45, delta_time)) @@ -1153,8 +1169,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(target.client) target.client.images += image -/obj/effect/hallucination/danger/anomaly/Crossed(atom/movable/AM) - . = ..() +/obj/effect/hallucination/danger/anomaly/proc/on_entered(datum/source, atom/movable/AM, ...) if(AM == target) new /datum/hallucination/shock(target) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 9880855e6d27..bbb28b85863c 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -3,7 +3,7 @@ //////////////////////////////////////////////////////////////////////////////// /obj/item/reagent_containers/food/drinks name = "drink" - desc = "yummy" + desc = "Yummy." icon = 'icons/obj/drinks.dmi' icon_state = "pineapplejuice" // Shouldn't see this anyways. lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index b77c89e57fc0..4e534d735429 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -100,6 +100,9 @@ if(user.a_intent != INTENT_HARM || !isGlass) return ..() + if(!synth_check(user, SYNTH_ORGANIC_HARM)) + return + if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm [target]!")) return diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 6ff0a7becbf0..b84e18eb9714 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -571,4 +571,12 @@ foodtype = MEAT | MICE | RAW /obj/item/reagent_containers/food/snacks/monkeycube/mouse/syndicate - faction = list("neutral", ROLE_SYNDICATE) \ No newline at end of file + faction = list("neutral", ROLE_SYNDICATE) + +/obj/item/reagent_containers/food/snacks/spam_musubi + name = "spam musubi" + desc = "A dish made of rice and meat of questionable origin." + icon_state = "spam_musubi" + list_reagents = list(/datum/reagent/consumable/nutriment/protein = 1, /datum/reagent/consumable/rice = 1) + tastes = list("meat?" = 1, "rice" = 1) + foodtype = MEAT | GRAIN diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 9275640353c4..4e6b04e745bd 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -567,10 +567,43 @@ desc = "A sliced piece of juicy pineapple." icon_state = "pineapple_slice" filling_color = "#F6CB0B" + list_reagents = list(/datum/reagent/consumable/nutriment = 1) + juice_results = list(/datum/reagent/consumable/pineapplejuice = 3) + tastes = list("pineapple" = 1) + foodtype = FRUIT | PINEAPPLE + +/obj/item/reagent_containers/food/snacks/pineappleslice/MakeGrillable() + AddComponent(/datum/component/grillable, /obj/item/reagent_containers/food/snacks/pineappleslice/grilled, rand(10 SECONDS, 15 SECONDS), TRUE) + +/obj/item/reagent_containers/food/snacks/pineappleslice/grilled + name = "grilled pineapple slice" + desc = "A grilled piece of juicy pineapple. Complete with tantilizing grill marks." + icon_state = "grilled_pineapple" + filling_color = "#F6CB0B" + list_reagents = list(/datum/reagent/consumable/nutriment = 3) juice_results = list(/datum/reagent/consumable/pineapplejuice = 3) tastes = list("pineapple" = 1) foodtype = FRUIT | PINEAPPLE +/obj/item/reagent_containers/food/snacks/pineappleslice/grilled/MakeGrillable() //so it burns after it grills + AddComponent(/datum/component/grillable, /obj/item/reagent_containers/food/snacks/badrecipe, rand(20 SECONDS, 30 SECONDS), FALSE) + +/obj/item/reagent_containers/food/snacks/pineapple_rice + name = "hawaiian pineapple rice" + desc = "A simple hawaiian rice dish served directly out of a pineapple." + icon_state = "pineapple_rice" + filling_color = "#F6CB0B" + tastes = list("pineapple" = 3, "rice" = 2) + foodtype = FRUIT | PINEAPPLE | GRAIN + +/obj/item/reagent_containers/food/snacks/pineapple_friedrice + name = "hawaiian pineapple fried rice" + desc = "You're telling me a hawaiian pineapple fried this rice?" + icon_state = "pineapple_friedrice" + filling_color = "#F6CB0B" + tastes = list("pineapple" = 3, "rice" = 2, "citrus" = 1, "chili" = 1) + foodtype = FRUIT | PINEAPPLE | GRAIN + /obj/item/reagent_containers/food/snacks/tinychocolate name = "chocolate" desc = "A tiny and sweet chocolate." @@ -605,4 +638,4 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#ffdf26" tastes = list("pickle" = 1, "spices" = 1, "salt water" = 2) - foodtype = VEGETABLES \ No newline at end of file + foodtype = VEGETABLES diff --git a/code/modules/food_and_drinks/food/snacks_seafood.dm b/code/modules/food_and_drinks/food/snacks_seafood.dm index d0574f6af193..46b3e93ee46f 100644 --- a/code/modules/food_and_drinks/food/snacks_seafood.dm +++ b/code/modules/food_and_drinks/food/snacks_seafood.dm @@ -178,7 +178,7 @@ /obj/item/reagent_containers/food/snacks/fishdumpling name = "fish dumpling" - desc = "a powerful little pocket of flavor." + desc = "A powerful little pocket of flavor." icon_state = "fishdumpling" bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 10) list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 15) //delicious onion and garlic and fish diff --git a/code/modules/food_and_drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm index 2a118d08f68b..759286d54c23 100644 --- a/code/modules/food_and_drinks/food/snacks_soup.dm +++ b/code/modules/food_and_drinks/food/snacks_soup.dm @@ -244,3 +244,12 @@ tastes = list("creamy peas"= 2, "parsnip" = 1) filling_color = "#9dc530" foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/soup/saimin + name = "saimin" + desc = "A traditional hawaiian noodle soup." + icon_state = "saimin" + bonus_reagents = list (/datum/reagent/consumable/nutriment/vitamin = 6) + tastes = list("eggs"= 1, "onion" = 1, "cabbage" = 1) + filling_color = "#9dc530" + foodtype = VEGETABLES | EGG | GRAIN diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 46a4b70f6087..b9106bbb0e99 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -74,6 +74,10 @@ to_chat(user, span_notice("[src] cannot be used unless bolted to the ground.")) return + if(is_synth(user)) + to_chat(user, span_warning("You don't want to use this!")) + return + if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling)) var/mob/living/L = user.pulling if(!iscarbon(L)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 16ac98441a7f..23ad2faf4df0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -159,7 +159,7 @@ return return ..() -/obj/machinery/smartfridge/obj_break(damage_flag) +/obj/machinery/smartfridge/atom_break(damage_flag) if(!(stat & BROKEN)) stat |= BROKEN update_appearance() @@ -331,6 +331,20 @@ else return ..() +/obj/machinery/smartfridge/welder_act(mob/living/user, obj/item/I) + . = ..() + if(stat & BROKEN) + if(!I.tool_start_check(user, amount=0)) + return + user.visible_message(span_notice("[user] is repairing [src]."), span_notice("You begin repairing [src]..."), span_hear("You hear welding.")) + if(I.use_tool(src, user, 4 SECONDS)) + if(!(stat & BROKEN)) + return + to_chat(user, span_notice("You repair [src].")) + update_integrity(max_integrity) + stat &= ~BROKEN + update_icon() + return TRUE /obj/machinery/smartfridge/proc/accept_check(obj/item/O) if(istype(O, /obj/item/reagent_containers/food/snacks/grown/) || istype(O, /obj/item/seeds/) || istype(O, /obj/item/grown/)) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 5c701880fac8..713ed55d3875 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -94,7 +94,7 @@ . += tag_overlay /obj/item/pizzabox/worn_overlays(isinhands, icon_file) - . = list() + . = ..() var/current_offset = 2 if(isinhands) for(var/V in boxes) //add EXTRA BOX per box diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm index 524e7aa37f2e..aeba846272ad 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm @@ -116,4 +116,3 @@ ) result = /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing category = CAT_DRINK - diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index 7a8be303146d..d7b50d6b17bd 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -286,4 +286,4 @@ /datum/reagent/colorful_reagent = 1 //Harder to make ) result = /obj/item/reagent_containers/food/snacks/snowcones/rainbow - category = CAT_ICE \ No newline at end of file + category = CAT_ICE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index 5b64724c87f5..a65b82b6d165 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -185,3 +185,13 @@ ) result = /obj/item/reagent_containers/food/snacks/fishfry category = CAT_MEAT + +/datum/crafting_recipe/food/spam_musubi + name = "Spam Musubi" + reqs = list( + /datum/reagent/consumable/nutriment/protein = 1, + /datum/reagent/consumable/rice = 1, + /obj/item/reagent_containers/food/snacks/seaweedsheet = 1 + ) + result = /obj/item/reagent_containers/food/snacks/spam_musubi + category = CAT_MEAT diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 8f002c6deb2a..be9a5a5d5b7f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -334,3 +334,26 @@ ) result = /obj/item/reagent_containers/food/snacks/chipsandsalsa category = CAT_MISCFOOD + +/datum/crafting_recipe/food/pineapple_rice + name = "Hawaiian Pineapple Rice" + reqs = list( + /obj/item/reagent_containers/food/snacks/grown/pineapple = 1, + /datum/reagent/consumable/rice = 5 + ) + result = /obj/item/reagent_containers/food/snacks/pineapple_rice + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/pineapple_friedrice + name = "Hawaiian Pineapple Fried Rice" + reqs = list( + /obj/item/reagent_containers/food/snacks/grown/pineapple = 1, + /datum/reagent/consumable/rice = 5, + /obj/item/reagent_containers/food/snacks/pineappleslice/grilled = 1, + /obj/item/reagent_containers/food/snacks/grown/chili = 1, + /obj/item/reagent_containers/food/snacks/grown/carrot = 1, + /datum/reagent/consumable/lemonjuice = 1, + /datum/reagent/consumable/limejuice = 1 + ) + result = /obj/item/reagent_containers/food/snacks/pineapple_friedrice + category = CAT_MISCFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm index 2319f58ee875..3cd513931a5b 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm @@ -258,3 +258,17 @@ ) result = /obj/item/reagent_containers/food/snacks/soup/peasoup category = CAT_SOUP + +/datum/crafting_recipe/food/saimin + name = "Saimin" + reqs = list( + /datum/reagent/water = 10, + /obj/item/reagent_containers/glass/bowl = 1, + /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1, + /obj/item/reagent_containers/food/snacks/egg = 1, + /datum/reagent/consumable/soysauce = 5, + /obj/item/reagent_containers/food/snacks/grown/onion = 1, + /obj/item/reagent_containers/food/snacks/grown/cabbage = 1 + ) + result = /obj/item/reagent_containers/food/snacks/soup/saimin + category = CAT_SOUP diff --git a/code/modules/goals/station_goals/bluespace_tap.dm b/code/modules/goals/station_goals/bluespace_tap.dm index a489004d4700..84f3f3b8bc9f 100644 --- a/code/modules/goals/station_goals/bluespace_tap.dm +++ b/code/modules/goals/station_goals/bluespace_tap.dm @@ -44,7 +44,7 @@ /obj/item/circuitboard/machine/bluespace_tap name = "Bluespace Harvester" - icon_state = "command" + greyscale_colors = CIRCUIT_COLOR_COMMAND build_path = /obj/machinery/power/bluespace_tap req_components = list( /obj/item/stock_parts/capacitor/quadratic = 5,//Probably okay, right? diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index fda9e32c3c5e..5763ced37db0 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -18,6 +18,10 @@ #define HOLODECK_CD 25 #define HOLODECK_DMG_CD 500 +/// typecache for turfs that should be considered ok during floorchecks. +/// A linked turf being anything not in this typecache will cause the holodeck to perform an emergency shutdown. +GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf/open/floor/holofloor, /turf/closed))) + /obj/machinery/computer/holodeck name = "holodeck control console" desc = "A computer used to control a nearby holodeck." @@ -239,7 +243,7 @@ if(!is_operational()) A = offline_program force = TRUE - if(A.minimum_sec_level > GLOB.security_level && !force && !(obj_flags & EMAGGED)) + if(A.minimum_sec_level > SSsecurity_level.get_current_level_as_number() && !force && !(obj_flags & EMAGGED)) say("ERROR. Program currently unavailiable, the security level is not high enough.") return if(program == A) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index dbcdde5169c5..fa9ece84f0a8 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -89,18 +89,18 @@ icon_state = SPACE_ICON_STATE // so realistic . = ..() -/turf/open/floor/holofloor/hyperspace - name = "\proper hyperspace" +/turf/open/floor/holofloor/bluespace + name = "\proper bluespace" icon = 'icons/turf/space.dmi' icon_state = "speedspace_ns_1" bullet_bounce_sound = null tiled_dirt = FALSE -/turf/open/floor/holofloor/hyperspace/Initialize(mapload) +/turf/open/floor/holofloor/bluespace/Initialize(mapload) icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" . = ..() -/turf/open/floor/holofloor/hyperspace/ns/Initialize(mapload) +/turf/open/floor/holofloor/bluespace/ns/Initialize(mapload) . = ..() icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" @@ -123,6 +123,8 @@ /turf/open/floor/holofloor/carpet/update_icon(updates=ALL) . = ..() + if(!.) + return FALSE if((updates & UPDATE_SMOOTHING) && overfloor_placed && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH(src) diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 86dfa455cf02..9ce00a1a355e 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -167,7 +167,7 @@ name = "pack of cherry bulb pits" desc = "The glowy kind of cherries." icon_state = "seed-cherrybulb" - species = "cherrybulb" + species = "cherry" // Same icons as normal cherries plantname = "Cherry Bulb Tree" product = /obj/item/reagent_containers/food/snacks/grown/cherrybulbs genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/pink) @@ -271,3 +271,31 @@ filling_color = "#eeff00" tastes = list("tv static" = 1, "sour pear" = 1, "grapefruit" = 1) distill_reagent = /datum/reagent/consumable/ethanol/wine_voltaic + + +//coconut +/obj/item/seeds/coconut + name = "pack of coconut seeds" + desc = "These seeds grow into a coconut tree." + icon_state = "seed-coconut" + species = "coconut" + plantname = "Coconut Tree" + product = /obj/item/reagent_containers/food/snacks/grown/coconut + growthstages = 7 + growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + icon_grow = "coconut-grow" + icon_dead = "coconut-dead" + icon_harvest = "coconut-harvest" + genes = list() + mutatelist = null + reagents_add = list(/datum/reagent/consumable/milk/coconut = 0.1, /datum/reagent/consumable/nutriment/protein = 0.01) + +/obj/item/reagent_containers/food/snacks/grown/coconut + seed = /obj/item/seeds/coconut + name = "coconut" + desc = "Too heavy for a five ounce bird to carry." + icon_state = "coconut" + tastes = list("coconut" = 4) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/protein = 1) + grind_results = list(/datum/reagent/consumable/milk/coconut = 20) + distill_reagent = /datum/reagent/consumable/ethanol/creme_de_coconut //eh, why not diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 693dbe5c2f6a..7d0c74703dfe 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -216,6 +216,10 @@ /obj/structure/bonfire/prelit/Initialize(mapload) . = ..() StartBurning() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) /obj/structure/bonfire/CanAllowThrough(atom/movable/mover, turf/target) . = ..() @@ -300,8 +304,7 @@ /obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume) StartBurning() -/obj/structure/bonfire/Crossed(atom/movable/AM) - . = ..() +/obj/structure/bonfire/proc/on_entered(datum/source, atom/movable/AM, ...) if(burning & !grill) Burn() diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 97b78a364f38..c8eab1654462 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -142,6 +142,7 @@ /obj/item/scythe/Initialize(mapload) . = ..() + AddComponent(/datum/component/cleave_attack, arc_size=180) AddComponent(/datum/component/butchering, 90, 105) /obj/item/scythe/suicide_act(mob/user) @@ -154,20 +155,6 @@ playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) return (BRUTELOSS) -/obj/item/scythe/pre_attack(atom/A, mob/living/user, params) - if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user)) - return ..() - else - var/turf/user_turf = get_turf(user) - var/dir_to_target = get_dir(user_turf, get_turf(A)) - swiping = TRUE - var/static/list/scythe_slash_angles = list(0, 45, 90, -45, -90) - for(var/i in scythe_slash_angles) - var/turf/T = get_step(user_turf, turn(dir_to_target, i)) - for(var/obj/structure/spacevine/V in T) - if(user.Adjacent(V)) - melee_attack_chain(user, V) - swiping = FALSE // ************************************* // Nutrient defines for hydroponics diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index ebe1c7120a3d..21a64c5c8903 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -151,7 +151,7 @@ ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_RND, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS, ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_RC_ANNOUNCE, - ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING, ACCESS_TCOM_ADMIN, ACCESS_PARAMEDIC, ACCESS_MANUFACTURING, ACCESS_BRIG_PHYS, ACCESS_PSYCH) //YOGS - yogs jobs + ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING, ACCESS_TCOM_ADMIN, ACCESS_PARAMEDIC, ACCESS_MANUFACTURING, ACCESS_BRIG_PHYS, ACCESS_PSYCH, ACCESS_SERVHALL) //YOGS - yogs jobs /// Gets all centcom accesses /proc/get_all_centcom_access() @@ -185,7 +185,7 @@ if(0) return get_all_accesses() if(1) //station general - return list(ACCESS_KITCHEN,ACCESS_BAR, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_LIBRARY, ACCESS_THEATRE, ACCESS_LAWYER, ACCESS_MANUFACTURING) + return list(ACCESS_KITCHEN,ACCESS_BAR, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_LIBRARY, ACCESS_THEATRE, ACCESS_LAWYER, ACCESS_MANUFACTURING, ACCESS_SERVHALL) if(2) //security return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_MECH_SECURITY, ACCESS_HOS) if(3) //medbay @@ -377,6 +377,8 @@ return "Freeminer Engineer" if(ACCESS_FREEMINER_CAPTAIN) return "Freeminer Captain" + if(ACCESS_SERVHALL) + return "Service Hall" // yogs end /// Get descriptions for centcom accesses @@ -408,7 +410,7 @@ "Atmospheric Technician", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist", // yogs start - Yog jobs "Research Director", "Scientist", "Roboticist", "Head of Security", "Warden", "Detective", "Security Officer", - "Network Admin", "Mining Medic", "Paramedic", "Psychiatrist", "Clerk", "Tourist", "Space Bartender", "Artist", "Brig Physician") + "Network Admin", "Mining Medic", "Paramedic", "Psychiatrist", "Clerk", "Tourist", "Space Bartender", "Artist", "Brig Physician", "Synthetic") // yogs end /// Gets all jobs with hud icons diff --git a/code/modules/jobs/departments/departments.dm b/code/modules/jobs/departments/departments.dm index a629c2eaab62..81b44473b7fa 100644 --- a/code/modules/jobs/departments/departments.dm +++ b/code/modules/jobs/departments/departments.dm @@ -43,7 +43,7 @@ department_experience_type = EXP_TYPE_COMMAND display_order = 1 label_class = "command" - ui_color = "#ccccff" + ui_color = "#6681a5" /datum/job_department/security @@ -53,7 +53,7 @@ department_experience_type = EXP_TYPE_SECURITY display_order = 2 label_class = "security" - ui_color = "#ffbbbb" + ui_color = "#d46a78" /datum/job_department/engineering @@ -63,7 +63,7 @@ department_experience_type = EXP_TYPE_ENGINEERING display_order = 3 label_class = "engineering" - ui_color = "#ffeeaa" + ui_color = "#dfb567" /datum/job_department/medical @@ -73,7 +73,7 @@ department_experience_type = EXP_TYPE_MEDICAL display_order = 4 label_class = "medical" - ui_color = "#c1e1ec" + ui_color = "#65b2bd" /datum/job_department/science @@ -83,7 +83,7 @@ department_experience_type = EXP_TYPE_SCIENCE display_order = 5 label_class = "science" - ui_color = "#ffddff" + ui_color = "#c973c9" /datum/job_department/cargo @@ -93,7 +93,7 @@ department_experience_type = EXP_TYPE_SUPPLY display_order = 6 label_class = "supply" - ui_color = "#d7b088" + ui_color = "#cf9c6c" /datum/job_department/service @@ -103,7 +103,7 @@ department_experience_type = EXP_TYPE_SERVICE display_order = 7 label_class = "service" - ui_color = "#ddddff" + ui_color = "#7cc46a" /datum/job_department/silicon @@ -113,7 +113,7 @@ department_experience_type = EXP_TYPE_SILICON display_order = 8 label_class = "silicon" - ui_color = "#ccffcc" + ui_color = "#5dbda0" /// Catch-all department for undefined jobs. diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 0a7c80874597..09464ee928a4 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -47,8 +47,6 @@ /// What kind of mob type joining players with this job as their assigned role are spawned as. var/spawn_type = /mob/living/carbon/human - /// Selection Color for job preferences - var/selection_color = "#ffffff" /// Alternate titles for the job var/list/alt_titles /// If this is set to TRUE, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect. @@ -98,6 +96,7 @@ /// Icons to be displayed in the orbit ui. Source: FontAwesome v5. var/orbit_icon + var/datum/species/forced_species /** * A list of job-specific areas to enable lights for if this job is present at roundstart, whenever minimal access is not in effect. * This will be combined with minimal_lightup_areas, so no need to duplicate entries. @@ -134,7 +133,6 @@ Here is another example of using this: /datum/job/doctor/proc/OmegaStationChanges() - selection_color = "#ffffff" total_positions = 3 spawn_positions = 3 added_access = list() @@ -186,11 +184,16 @@ if(!H) return FALSE + + //This reads Command placement exceptions in code/controllers/configuration/entries/game_options to allow non-Humans in specified Command roles. If the combination of species and command role is invalid, default to Human. if(CONFIG_GET(keyed_list/job_species_whitelist)[type] && !splittext(CONFIG_GET(keyed_list/job_species_whitelist)[type], ",").Find(H.dna.species.id)) if(H.dna.species.id != "human") H.set_species(/datum/species/human) H.apply_pref_name(/datum/preference/name/backup_human, preference_source) + + if(forced_species) + H.set_species(forced_species) if(!visualsOnly) var/datum/bank_account/bank_account = new(H.real_name, src) @@ -328,9 +331,6 @@ if (H.jumpsuit_style == PREF_SKIRT && uniform_skirt) uniform = uniform_skirt - if (isplasmaman(H) && !(visualsOnly)) //this is a plasmaman fix to stop having two boxes - box = null - if((DIGITIGRADE in H.dna.species.species_traits) && digitigrade_shoes) shoes = digitigrade_shoes @@ -362,15 +362,17 @@ B.bank_cards += C H.sec_hud_set_ID() - var/obj/item/modular_computer/PDA = new pda_type() - if(istype(PDA)) - PDA.InsertID(C) - H.equip_to_slot_if_possible(PDA, ITEM_SLOT_ID) + if(pda_type) + var/obj/item/modular_computer/PDA = new pda_type() + if(istype(PDA)) + PDA.InsertID(C) + H.equip_to_slot_if_possible(PDA, ITEM_SLOT_ID) - PDA.update_label() - PDA.update_appearance(UPDATE_ICON) - PDA.update_filters() - + PDA.update_label() + PDA.update_appearance(UPDATE_ICON) + PDA.update_filters() + else + H.equip_to_slot_if_possible(C, ITEM_SLOT_ID) else H.equip_to_slot_if_possible(C, ITEM_SLOT_ID) diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index 62a8798e8b7c..9df34178ac02 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -6,7 +6,6 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - selection_color = "#ccffcc" supervisors = "your laws" req_admin_notify = TRUE minimal_player_age = 30 @@ -34,13 +33,13 @@ . = ..() var/mob/living/silicon/ai/AI = spawned - AI.relocate(TRUE) + AI.relocate(TRUE, TRUE) + + var/total_available_cpu = 1 - AI.ai_network.resources.total_cpu_assigned() + var/total_available_ram = AI.ai_network.resources.total_ram() - AI.ai_network.resources.total_ram_assigned() - var/total_available_cpu = 1 - GLOB.ai_os.total_cpu_assigned() - var/total_available_ram = GLOB.ai_os.total_ram - GLOB.ai_os.total_ram_assigned() - - GLOB.ai_os.set_cpu(AI, total_available_cpu) - GLOB.ai_os.add_ram(AI, total_available_ram) + AI.ai_network.resources.set_cpu(AI, total_available_cpu) + AI.ai_network.resources.add_ram(AI, total_available_ram) AI.apply_pref_name(/datum/preference/name/ai, M.client) //If this runtimes oh well jobcode is fucked. AI.set_core_display_icon(null, M.client) diff --git a/code/modules/jobs/job_types/artist.dm b/code/modules/jobs/job_types/artist.dm index 55784466133e..92e77a296737 100644 --- a/code/modules/jobs/job_types/artist.dm +++ b/code/modules/jobs/job_types/artist.dm @@ -7,12 +7,11 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#dddddd" outfit = /datum/outfit/job/artist alt_titles = list("Painter", "Composer", "Artisan") added_access = list() - base_access = list() + base_access = list(ACCESS_SERVHALL) paycheck = PAYCHECK_ASSISTANT paycheck_department = ACCOUNT_CIV @@ -39,7 +38,7 @@ name = "Artist" jobtype = /datum/job/artist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/artist head = /obj/item/clothing/head/frenchberet ears = /obj/item/radio/headset/headset_srv diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 666a68b0f168..43a61cbea946 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -9,7 +9,6 @@ Assistant total_positions = 5 spawn_positions = 5 supervisors = "absolutely everyone" - selection_color = "#dddddd" added_access = list() //See /datum/job/assistant/get_access() base_access = list() //See /datum/job/assistant/get_access() outfit = /datum/outfit/job/assistant @@ -63,5 +62,5 @@ Assistant // This outfit is used by the assets SS, which is ran before the atoms SS if (SSatoms.initialized == INITIALIZATION_INSSATOMS) - // H.w_uniform?.update_greyscale() + H.w_uniform?.update_greyscale() H.update_inv_w_uniform() diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 2d4b57815cd2..f280fe74ca06 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -7,7 +7,6 @@ total_positions = 3 spawn_positions = 2 supervisors = "the chief engineer" - selection_color = "#fff5cc" exp_requirements = 180 exp_type = EXP_TYPE_CREW alt_titles = list("Life-support Technician", "Fire Suppression Specialist", "Atmospherics Trainee", "Environmental Maintainer", "Fusion Specialist") @@ -42,7 +41,7 @@ name = "Atmospheric Technician" jobtype = /datum/job/atmos - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/atmos + pda_type = /obj/item/modular_computer/tablet/pda/preset/atmos belt = /obj/item/storage/belt/utility/atmostech ears = /obj/item/radio/headset/headset_eng @@ -54,7 +53,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 66fce46dc27a..0f2782538a1f 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -7,7 +7,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#bbe291" exp_type_department = EXP_TYPE_SERVICE // This is so the jobs menu can work properly alt_titles = list("Barkeep", "Tapster", "Barista", "Mixologist") @@ -15,7 +14,7 @@ outfit = /datum/outfit/job/bartender added_access = list(ACCESS_HYDROPONICS, ACCESS_KITCHEN, ACCESS_MORGUE) - base_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_WEAPONS) + base_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM, ACCESS_WEAPONS, ACCESS_SERVHALL) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BARTENDER @@ -45,7 +44,7 @@ name = "Bartender" jobtype = /datum/job/bartender - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/fountainpen + pda_type = /obj/item/modular_computer/tablet/pda/preset/fountainpen/bartender glasses = /obj/item/clothing/glasses/sunglasses/reagent ears = /obj/item/radio/headset/headset_srv diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 3e366db34668..9565d0670c8c 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -7,14 +7,13 @@ total_positions = 3 spawn_positions = 2 supervisors = "the head of personnel" - selection_color = "#bbe291" outfit = /datum/outfit/job/botanist alt_titles = list("Ecologist", "Agriculturist", "Botany Greenhorn", "Hydroponicist", "Gardener") added_access = list(ACCESS_BAR, ACCESS_KITCHEN) - base_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + base_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM, ACCESS_SERVHALL) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV display_order = JOB_DISPLAY_ORDER_BOTANIST @@ -41,7 +40,7 @@ name = "Botanist" jobtype = /datum/job/hydro - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/botanist ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/hydroponics diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 6365594bd8dc..75d55d8b4aed 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -10,7 +10,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "Nanotrasen officers and Space law" //Changed to officer to separate from CentCom officials being their superior. - selection_color = "#ccccff" req_admin_notify = 1 space_law_notify = 1 //Yogs minimal_player_age = 14 diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 14ea8105f32b..39eac3ceebc3 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -9,7 +9,6 @@ total_positions = 2 spawn_positions = 1 supervisors = "the quartermaster and the head of personnel" - selection_color = "#dcba97" outfit = /datum/outfit/job/cargo_tech @@ -50,3 +49,7 @@ uniform_skirt = /obj/item/clothing/under/rank/cargotech/skirt l_hand = /obj/item/export_scanner +/datum/outfit/job/cargo_tech/no_pda + name = "Cargo Technician (No PDA)" + + pda_type = null diff --git a/code/modules/jobs/job_types/centcom.dm b/code/modules/jobs/job_types/centcom.dm index dfb2d93c8162..20aa099d2595 100644 --- a/code/modules/jobs/job_types/centcom.dm +++ b/code/modules/jobs/job_types/centcom.dm @@ -16,7 +16,7 @@ belt = /obj/item/gun/energy/e_gun l_pocket = /obj/item/pen back = /obj/item/storage/backpack/satchel - r_pocket = /obj/item/pda/heads + r_pocket = /obj/item/modular_computer/tablet/pda/preset/bureaucrat l_hand = /obj/item/clipboard id = /obj/item/card/id/centcom backpack_contents = list(/obj/item/restraints/handcuffs/cable/zipties=1, /obj/item/stamp/cent = 1,) diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index 3cd1ee881bd2..076e60d6dcee 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -8,14 +8,13 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#dddddd" outfit = /datum/outfit/job/chaplain alt_titles = list("Priest", "Preacher", "Cleric", "Exorcist", "Vicar") added_access = list() - base_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE) + base_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE, ACCESS_SERVHALL) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_CIV @@ -176,7 +175,7 @@ name = "Chaplain" jobtype = /datum/job/chaplain - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/chaplain ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/chaplain diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 140bd0337c28..bb68d92217d1 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -8,7 +8,6 @@ total_positions = 2 spawn_positions = 2 supervisors = "the chief medical officer" - selection_color = "#d4ebf2" exp_type = EXP_TYPE_CREW exp_requirements = 120 exp_type_department = EXP_TYPE_MEDICAL @@ -53,7 +52,7 @@ name = "Chemist" jobtype = /datum/job/chemist - pda_type = /obj/item/modular_computer/tablet/pda/preset/chem + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/chem glasses = /obj/item/clothing/glasses/science ears = /obj/item/radio/headset/headset_med diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 9c0b7297f63d..5ac7390fee2c 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -10,7 +10,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffeeaa" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 1500 //25 hours @@ -69,7 +68,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer chameleon_extras = /obj/item/stamp/ce pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 2bc428901cc5..2dec1ebd5fe6 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -10,7 +10,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#c1e1ec" req_admin_notify = 1 minimal_player_age = 7 exp_requirements = 1500 //25 hours diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 7fc1b36a9f38..aa36c0940476 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -7,14 +7,13 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#dddddd" outfit = /datum/outfit/job/clown alt_titles = list("Entertainer", "Comedian", "Jester", "Improv Artist") added_access = list() - base_access = list(ACCESS_THEATRE) + base_access = list(ACCESS_THEATRE, ACCESS_SERVHALL) paycheck = PAYCHECK_MINIMAL paycheck_department = ACCOUNT_SRV @@ -46,7 +45,7 @@ name = "Clown" jobtype = /datum/job/clown - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/clown + pda_type = /obj/item/modular_computer/tablet/pda/preset/clown ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/clown @@ -66,7 +65,7 @@ satchel = /obj/item/storage/backpack/clown duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel - box = /obj/item/storage/box/hug/survival + box = /obj/item/storage/box/survival/hug chameleon_extras = /obj/item/stamp/clown diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index b0efc565e7a6..077438809b92 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -7,7 +7,6 @@ total_positions = 2 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#bbe291" var/cooks = 0 //Counts cooks amount outfit = /datum/outfit/job/cook @@ -15,7 +14,7 @@ alt_titles = list("Chef", "Hash Slinger", "Sous-chef", "Culinary Artist", "Culinarian") added_access = list(ACCESS_HYDROPONICS, ACCESS_BAR) - base_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM) + base_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM, ACCESS_SERVHALL) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV @@ -47,7 +46,7 @@ name = "Cook" jobtype = /datum/job/cook - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/cook ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/chef diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index eb7aae9266a3..c3bfe90965cc 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -8,14 +8,13 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#dddddd" outfit = /datum/outfit/job/curator alt_titles = list("Librarian", "Journalist", "Archivist", "Cartographer", "Space Archaeologist") added_access = list() - base_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION) + base_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION, ACCESS_SERVHALL) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_CIV mind_traits = list(TRAIT_BLOODSUCKER_HUNTER) @@ -48,7 +47,7 @@ name = "Curator" jobtype = /datum/job/curator - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/fountainpen + pda_type = /obj/item/modular_computer/tablet/pda/preset/fountainpen/curator ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/curator diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index c1b202ae57f1..b2b714a9d6c1 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -7,7 +7,6 @@ total_positions = 0 spawn_positions = 2 supervisors = "your laws and the AI" //Nodrak - selection_color = "#ddffdd" minimal_player_age = 21 exp_requirements = 120 exp_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index ddc4fd758b16..3f95228c5949 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -9,7 +9,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of security" - selection_color = "#ffeeee" minimal_player_age = 7 exp_requirements = 180 exp_type = EXP_TYPE_SECURITY @@ -63,7 +62,7 @@ name = "Detective" jobtype = /datum/job/detective - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/security/detective ears = /obj/item/radio/headset/headset_sec/alt uniform = /obj/item/clothing/under/rank/det diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 2b92768b71bd..7825539565b9 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -7,7 +7,6 @@ total_positions = 2 spawn_positions = 2 supervisors = "the chief medical officer and research director" - selection_color = "#d4ebf2" exp_type = EXP_TYPE_CREW exp_requirements = 60 alt_titles = list("DNA Mechanic", "Bioengineer", "Junior Geneticist", "Gene Splicer", "Mutation Specialist") @@ -46,7 +45,7 @@ name = "Geneticist" jobtype = /datum/job/geneticist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/geneticist ears = /obj/item/radio/headset/headset_medsci uniform = /obj/item/clothing/under/rank/geneticist diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 4d684d9a14ca..234d9841c94b 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -10,7 +10,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ddddff" req_admin_notify = 1 minimal_player_age = 10 exp_requirements = 720 //fairly low skill job @@ -27,7 +26,7 @@ ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_QM, ACCESS_HYDROPONICS, ACCESS_LAWYER, ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MANUFACTURING) //yogs - added ACCESS_MANUFACTURING as it's the clerk's + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MANUFACTURING, ACCESS_SERVHALL) //yogs - added ACCESS_MANUFACTURING as it's the clerk's paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SRV diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index b3449b86cc8e..52f942866c02 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -10,7 +10,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffdddd" req_admin_notify = 1 minimal_player_age = 14 exp_requirements = 1500 //25 hours @@ -96,7 +95,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security + box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 55e6708188cd..d7f16be91c27 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -7,14 +7,13 @@ total_positions = 2 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#bbe291" outfit = /datum/outfit/job/janitor alt_titles = list("Custodian", "Sanitation Worker", "Cleaner", "Caretaker", "Maid") added_access = list() - base_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO, ACCESS_RESEARCH, ACCESS_MEDICAL) + base_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO, ACCESS_RESEARCH, ACCESS_MEDICAL, ACCESS_SERVHALL) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_SRV @@ -42,7 +41,7 @@ name = "Janitor" jobtype = /datum/job/janitor - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/janitor ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/janitor diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 2e4c1aaa7850..6f1bce7c8330 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -8,14 +8,13 @@ total_positions = 2 spawn_positions = 2 supervisors = "the head of personnel" - selection_color = "#dddddd" var/lawyers = 0 //Counts lawyer amount alt_titles = list("Prosecutor", "Defense Attorney", "Paralegal", "Ace Attorney") outfit = /datum/outfit/job/lawyer added_access = list() - base_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS) + base_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS, ACCESS_SERVHALL) paycheck = PAYCHECK_EASY paycheck_department = ACCOUNT_CIV mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) @@ -41,7 +40,7 @@ name = "Lawyer" jobtype = /datum/job/lawyer - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/fountainpen + pda_type = /obj/item/modular_computer/tablet/pda/preset/fountainpen/lawyer ears = /obj/item/radio/headset/headset_srvsec uniform = /obj/item/clothing/under/lawyer/bluesuit diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index dd83f89c8d16..b44a4dcf9e6a 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -8,7 +8,6 @@ total_positions = 5 spawn_positions = 3 supervisors = "the chief medical officer" - selection_color = "#d4ebf2" exp_requirements = 180 exp_type = EXP_TYPE_CREW alt_titles = list("Physician", "Surgeon", "Nurse", "Medical Resident", "Attending Physician", "General Practitioner") diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index c64526aeb6bb..00c7187fb5ff 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -7,14 +7,13 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#dddddd" outfit = /datum/outfit/job/mime alt_titles = list("Mute Entertainer", "Silent Jokester", "Pantomimist") added_access = list() - base_access = list(ACCESS_THEATRE) + base_access = list(ACCESS_THEATRE, ACCESS_SERVHALL) paycheck = PAYCHECK_MINIMAL paycheck_department = ACCOUNT_SRV @@ -44,7 +43,7 @@ name = "Mime" jobtype = /datum/job/mime - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic/mime + pda_type = /obj/item/modular_computer/tablet/pda/preset/mime ears = /obj/item/radio/headset/headset_srv uniform = /obj/item/clothing/under/rank/mime @@ -57,7 +56,7 @@ /obj/item/book/mimery=1, /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1, /obj/item/stamp/mime = 1) - + box = /obj/item/storage/box/survival/hug/black backpack = /obj/item/storage/backpack/mime satchel = /obj/item/storage/backpack/mime diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index e30304d00b2c..9a68886ef628 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -8,7 +8,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#d7b088" outfit = /datum/outfit/job/quartermaster alt_titles = list("Stock Controller", "Cargo Coordinator", "Shipping Overseer", "Postmaster General") added_access = list() @@ -45,7 +44,7 @@ name = "Quartermaster" jobtype = /datum/job/qm - pda_type = /obj/item/modular_computer/tablet/pda/preset/cargo + pda_type = /obj/item/modular_computer/tablet/pda/preset/cargo/quartermaster ears = /obj/item/radio/headset/headset_cargo uniform = /obj/item/clothing/under/rank/cargo diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index e381a867427a..b6a91ef5c87d 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -11,7 +11,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the captain" - selection_color = "#ffddff" req_admin_notify = 1 minimal_player_age = 7 exp_type_department = EXP_TYPE_SCIENCE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index b798d1c85e75..b90ccf3d6aec 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -7,7 +7,6 @@ total_positions = 2 spawn_positions = 2 supervisors = "the research director" - selection_color = "#ffeeff" exp_requirements = 60 exp_type = EXP_TYPE_CREW alt_titles = list("Augmentation Theorist", "Cyborg Maintainer", "Robotics Intern", "Biomechanical Engineer", "Mechatronic Engineer", "Machinist", "Chrome Shaman", "Ripperdoc") diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index b69a337ab166..19e4a4b7e9be 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -7,7 +7,6 @@ total_positions = 5 spawn_positions = 3 supervisors = "the research director" - selection_color = "#ffeeff" exp_requirements = 180 exp_type = EXP_TYPE_CREW alt_titles = list("Researcher", "Toxins Specialist", "Physicist", "Test Associate", "Anomalist", "Quantum Physicist", "Theoretical Physicist", "Xenobiologist", "Explosives Technician", "Hypothetical Physicist") @@ -52,7 +51,7 @@ name = "Scientist" jobtype = /datum/job/scientist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/scientist ears = /obj/item/radio/headset/headset_sci uniform = /obj/item/clothing/under/rank/scientist diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 30564c5c89cf..ebb83b948104 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -9,7 +9,6 @@ total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() supervisors = "the head of security, and the head of your assigned department (if applicable)" - selection_color = "#ffeeee" minimal_player_age = 7 exp_requirements = 300 exp_type = EXP_TYPE_CREW @@ -158,7 +157,7 @@ GLOBAL_LIST_INIT(available_depts_sec, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICA name = "Security Officer" jobtype = /datum/job/officer - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/security ears = /obj/item/radio/headset/headset_sec/alt uniform = /obj/item/clothing/under/rank/security @@ -175,7 +174,7 @@ GLOBAL_LIST_INIT(available_depts_sec, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICA backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security + box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 1163f300518e..cfc2e3f2b564 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -8,7 +8,6 @@ total_positions = 3 spawn_positions = 3 supervisors = "the quartermaster and the head of personnel" - selection_color = "#dcba97" alt_titles = list("Lavaland Scout", "Prospector", "Junior Miner", "Major Miner", "Surveyor") outfit = /datum/outfit/job/miner @@ -25,6 +24,10 @@ /datum/job_department/cargo, ) + minimal_lightup_areas = list( + /area/construction/mining/aux_base + ) + mail_goodies = list( /obj/item/reagent_containers/autoinjector/medipen/survival = 10, /obj/item/grenade/plastic/miningcharge/lesser = 10, @@ -41,7 +44,7 @@ name = "Shaft Miner" jobtype = /datum/job/mining - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/shaft_miner ears = /obj/item/radio/headset/headset_cargo/mining shoes = /obj/item/clothing/shoes/workboots/mining @@ -62,7 +65,7 @@ backpack = /obj/item/storage/backpack/explorer satchel = /obj/item/storage/backpack/satchel/explorer duffelbag = /obj/item/storage/backpack/duffelbag - box = /obj/item/storage/box/survival_mining + box = /obj/item/storage/box/survival/mining chameleon_extras = /obj/item/gun/energy/kinetic_accelerator diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 1caf26068293..c1df81b52b5a 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -8,7 +8,6 @@ total_positions = 5 spawn_positions = 5 supervisors = "the chief engineer" - selection_color = "#fff5cc" exp_requirements = 180 exp_type = EXP_TYPE_CREW alt_titles = list("Engine Technician", "Solar Engineer", "Project Engineer", "Junior Engineer", "Construction Specialist") @@ -111,7 +110,7 @@ GLOBAL_LIST_INIT(available_depts_eng, list(ENG_DEPT_MEDICAL, ENG_DEPT_SCIENCE, E backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/synthetic.dm b/code/modules/jobs/job_types/synthetic.dm new file mode 100644 index 000000000000..8d81d1107ef4 --- /dev/null +++ b/code/modules/jobs/job_types/synthetic.dm @@ -0,0 +1,105 @@ +GLOBAL_LIST_INIT(synthetic_base_access, list(ACCESS_MAINT_TUNNELS, ACCESS_KITCHEN, ACCESS_CREMATORIUM, ACCESS_JANITOR, ACCESS_BAR, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_NETWORK, ACCESS_MINISAT, ACCESS_TCOMSAT, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_EVA, ACCESS_CREMATORIUM, ACCESS_HYDROPONICS, ACCESS_MANUFACTURING, ACCESS_THEATRE, ACCESS_TCOM_ADMIN)) +GLOBAL_LIST_EMPTY(synthetic_added_access) +/datum/job/synthetic + title = "Synthetic" + description = "Watch over the crew, carry out mundane tasks that nobody else want to. Do no harm." + orbit_icon = "eye" + auto_deadmin_role_flags = DEADMIN_POSITION_SILICON|DEADMIN_POSITION_CRITICAL + department_head = list("AI") + faction = "Station" + total_positions = 0 + spawn_positions = 1 + supervisors = "the AI" + minimal_player_age = 30 + exp_requirements = 900 + exp_type = EXP_TYPE_CREW + exp_type_department = EXP_TYPE_COMMAND + + outfit = /datum/outfit/job/synthetic + + added_access = list() + base_access = list() + paycheck = 0 + paycheck_department = ACCOUNT_SCI + mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_SYNTHETIC + + departments_list = list( + /datum/job_department/silicon, + ) + + + mail_goodies = list() + + smells_like = "calculated machinery" + alt_titles = list() + + forced_species = /datum/species/wy_synth + +/datum/job/synthetic/after_spawn(mob/living/H, mob/M, latejoin = FALSE) + . = ..() + + addtimer(CALLBACK(src, PROC_REF(synth_name_choose), H, M), 1 SECONDS) + H.remove_all_quirks() + +/datum/job/synthetic/proc/synth_name_choose(mob/living/H, mob/M) + var/newname = sanitize_name(reject_bad_text(stripped_input(M, "Please input your name.", "Name change", H.real_name, MAX_NAME_LEN))) + + H.fully_replace_character_name(H.real_name, newname) + if(iscarbon(H)) //doing these two JUST to be sure you dont have edge cases of your DNA and mind not matching your new name, somehow + var/mob/living/carbon/C = H + if(C?.dna) + C?.dna?.real_name = newname + if(H?.mind) + H?.mind?.name = newname + + +/datum/job/synthetic/get_access() + return GLOB.synthetic_base_access + + +/datum/outfit/job/synthetic + name = "Synthetic" + + jobtype = /datum/job/synthetic + ears = /obj/item/radio/headset/headset_synthetic + + suit = /obj/item/clothing/suit/space/hardsuit/synth + + pda_type = null + id_type = /obj/item/card/id/synthetic + +/datum/outfit/job/synthetic/post_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + if(H.w_uniform) + var/obj/item/clothing/under/wearing = H.w_uniform + wearing.has_sensor = FALSE + + var/obj/machinery/ai/data_core/core + core = H.available_ai_cores(forced = TRUE) + if(core) + core.network.add_synth(H) + + + + + +/datum/outfit/job/synthetic/naked + name = "Synthetic (Naked)" + + uniform = null + ears = null + back = null + shoes = null + box = null + + preload = FALSE // These are used by the prefs ui, and also just kinda could use the extra help at roundstart + + backpack = null + satchel = null + duffelbag = null + + +/datum/outfit/job/synthetic/naked/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + return diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 837e74c86c6a..7b4332d33ca3 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -8,7 +8,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the chief medical officer" - selection_color = "#d4ebf2" exp_type = EXP_TYPE_CREW exp_requirements = 120 minimal_player_age = 7 @@ -57,7 +56,7 @@ name = "Virologist" jobtype = /datum/job/virologist - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/viro ears = /obj/item/radio/headset/headset_med uniform = /obj/item/clothing/under/rank/virologist diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index ccb68f5c0e1c..eb9d786179fc 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -10,7 +10,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of security" - selection_color = "#ffeeee" minimal_player_age = 7 exp_requirements = 600 exp_type = EXP_TYPE_CREW @@ -71,7 +70,7 @@ name = "Warden" jobtype = /datum/job/warden - pda_type = /obj/item/modular_computer/tablet/pda/preset/warden + pda_type = /obj/item/modular_computer/tablet/pda/preset/security/warden ears = /obj/item/radio/headset/headset_sec/alt uniform = /obj/item/clothing/under/rank/warden @@ -89,7 +88,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec - box = /obj/item/storage/box/security + box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 70542eee66fb..a18772061cfe 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -225,7 +225,7 @@ if(!literate) to_chat(user, span_notice("You scribble illegibly on the cover of [src]!")) return - var/choice = input(usr, "What would you like to change?",,list("Title", "Contents", "Author", "Cancel")) + var/choice = input(usr, "What would you like to change?", "Change book title, author, or add content?") as null|anything in list("Title", "Author", "Contents", "Cancel") if(!user.canUseTopic(src, BE_CLOSE, literate)) return switch(choice) @@ -243,7 +243,7 @@ name = newtitle title = newtitle if("Contents") - var/content = stripped_input(user, "Write your book's contents (HTML NOT allowed):","","",8192) + var/content = stripped_input(user, "Add to your book's contents (HTML NOT allowed):","","",8192) if(!user.canUseTopic(src, BE_CLOSE, literate)) return if(!content) diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index e5a25d297f46..da100fd2c794 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -56,6 +56,7 @@ var/list/obj/machinery/atmospherics/atmos_machines = list() var/list/obj/structure/cable/cables = list() + var/list/obj/structure/ethernet_cable/ethernet_cables = list() var/list/atom/movable/movables = list() var/list/obj/docking_port/stationary/ports = list() var/list/area/areas = list() @@ -85,6 +86,9 @@ if(istype(movable_in_turf, /obj/structure/cable)) cables += movable_in_turf continue + if(istype(movable_in_turf, /obj/structure/ethernet_cable)) + ethernet_cables += movable_in_turf + continue if(istype(movable_in_turf, /obj/machinery/atmospherics)) atmos_machines += movable_in_turf if(istype(movable_in_turf, /obj/docking_port/stationary)) @@ -110,6 +114,7 @@ // NOTE, now that Initialize and LateInitialize run correctly, do we really // need these two below? SSmachines.setup_template_powernets(cables) + SSmachines.setup_template_ainets(ethernet_cables) SSair.setup_template_machinery(atmos_machines) //calculate all turfs inside the border diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 43f08d0157c9..12b2a5502dbf 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -236,7 +236,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) log_mapping("[src] at [x],[y] could not find any morgues.") return for (var/i = 1 to bodycount) - var/obj/structure/bodycontainer/morgue/j = pick(trays) + var/obj/structure/bodycontainer/morgue/j = pick_n_take(trays) var/mob/living/carbon/human/h = new /mob/living/carbon/human(j, 1) h.death() for (var/part in h.internal_organs) //randomly remove organs from each body, set those we keep to be in stasis diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index 0f14017d188c..77eb35ab2e23 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -79,7 +79,7 @@ if(LAZYLEN(turrets)) for(var/turret in turrets) var/obj/machinery/porta_turret/aux_base/base_turret = turret - var/turret_integrity = clamp(round((base_turret.obj_integrity / base_turret.max_integrity)*100,2), 0, 100) + var/turret_integrity = clamp(round((base_turret.get_integrity() / base_turret.max_integrity)*100,2), 0, 100) var/turret_status if(base_turret.stat & BROKEN) turret_status = "ERROR" diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 284b9641ff30..46f4850e0a7a 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -22,7 +22,7 @@ dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated ..() -/obj/item/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty. +/obj/item/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt consoles start empty. name = "internal RCD" max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary. no_ammo_message = span_warning("Internal matter exhausted. Please add additional materials.") @@ -43,10 +43,8 @@ var/obj/item/construction/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste. var/obj/machinery/computer/auxiliary_base/found_aux_console //Tracker for the Aux base console, so the eye can always find it. - var/datum/action/innate/aux_base/switch_mode/switch_mode_action = new //Action for switching the RCD's build modes + var/datum/action/innate/aux_base/configure_mode/configure_mode_action = new //Action for switching the RCD's build modes var/datum/action/innate/aux_base/build/build_action = new //Action for using the RCD - var/datum/action/innate/aux_base/airlock_type/airlock_mode_action = new //Action for setting the airlock type - var/datum/action/innate/aux_base/window_type/window_action = new //Action for setting the window type var/fans_remaining = 0 //Number of fans in stock. var/datum/action/innate/aux_base/place_fan/fan_action = new //Action for spawning fans var/turret_stock = 0 //Turrets in stock @@ -96,26 +94,16 @@ /obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user) ..() - if(switch_mode_action) - switch_mode_action.target = src - switch_mode_action.Grant(user) - actions += switch_mode_action + if(configure_mode_action) + configure_mode_action.target = src + configure_mode_action.Grant(user) + actions += configure_mode_action if(build_action) build_action.target = src build_action.Grant(user) actions += build_action - if(airlock_mode_action) - airlock_mode_action.target = src - airlock_mode_action.Grant(user) - actions += airlock_mode_action - - if(window_action) - window_action.target = src - window_action.Grant(user) - actions += window_action - if(fan_action) fan_action.target = src fan_action.Grant(user) @@ -190,38 +178,17 @@ B.RCD.afterattack(rcd_target, owner, TRUE) //Activate the RCD and force it to work remotely! playsound(target_turf, 'sound/items/deconstruct.ogg', 60, 1) -/datum/action/innate/aux_base/switch_mode - name = "Switch Mode" - button_icon_state = "builder_mode" - -/datum/action/innate/aux_base/switch_mode/Activate() - if(..()) - return - - var/list/buildlist = list("Walls and Floors" = RCD_FLOORWALL,"Airlocks" = RCD_AIRLOCK,"Deconstruction" = RCD_DECONSTRUCT,"Windows and Grilles" = RCD_WINDOWGRILLE) - var/buildmode = input(owner, "Set construction mode.", "Base Console", null) in buildlist - B.RCD.mode = buildlist[buildmode] - to_chat(owner, "Build mode is now [buildmode].") +/datum/action/innate/aux_base/configure_mode + name = "Configure RCD" + button_icon = 'icons/obj/tools.dmi' + button_icon_state = "rcd" -/datum/action/innate/aux_base/airlock_type - name = "Select Airlock Type" - button_icon_state = "airlock_select" - -datum/action/innate/aux_base/airlock_type/Activate() +/datum/action/innate/aux_base/configure_mode/Activate() if(..()) return - B.RCD.change_airlock_setting(owner, remote_eye) - - -datum/action/innate/aux_base/window_type - name = "Select Window Glass" - button_icon_state = "window_select" - -datum/action/innate/aux_base/window_type/Activate() - if(..()) - return - B.RCD.toggle_window_glass(owner) + B.RCD.owner = B + B.RCD.ui_interact(owner) datum/action/innate/aux_base/place_fan name = "Place Tiny Fan" diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 7e085227c744..19eea5ae191a 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -200,7 +200,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) /obj/effect/extraction_holder name = "extraction holder" - desc = "you shouldnt see this" + desc = "You shouldn't see this." var/atom/movable/stored_obj /obj/item/extraction_pack/proc/check_for_living_mobs(atom/A) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 8eb74ad1ddfe..859732d9b6d3 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -317,7 +317,7 @@ GLOBAL_LIST_EMPTY(aide_list) /obj/effect/wisp/proc/update_user_sight(mob/user) SIGNAL_HANDLER - user.sight |= sight_flags + user.add_sight(sight_flags) if(!isnull(color_cutoffs)) user.lighting_color_cutoffs = blend_cutoff_colors(user.lighting_color_cutoffs, color_cutoffs) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index d6597e8a269f..c44266502869 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -19,15 +19,19 @@ var/icon_deny = "mining-deny" var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces. new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750, VENDING_WEAPON), - new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750, VENDING_WEAPON), + new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750, VENDING_WEAPON), new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800, VENDING_WEAPON), new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500, VENDING_WEAPON), new /datum/data/mining_equipment("Kinetic Javelin", /obj/item/kinetic_javelin/blue, 1000, VENDING_WEAPON), //YOGS EDIT new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000, VENDING_WEAPON), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000, VENDING_WEAPON), new /datum/data/mining_equipment("Mini Plasma Cutter", /obj/item/gun/energy/plasmacutter/mini, 2500, VENDING_WEAPON), - new /datum/data/mining_equipment("Plasma Cutter Shotgun", /obj/item/gun/energy/plasmacutter/scatter, 6000, VENDING_WEAPON), - new /datum/data/mining_equipment("Plasma Shotgun Upgrade", /obj/item/upgrade/plasmacutter/defuser, 1000, VENDING_WEAPON), + new /datum/data/mining_equipment("Plasma Cutter Shotgun", /obj/item/gun/energy/plasmacutter/scatter, 5000, VENDING_WEAPON), + new /datum/data/mining_equipment("PC Defuser Upgrade", /obj/item/upgrade/plasmacutter/defuser, 1000, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Capacity Upgrade", /obj/item/upgrade/plasmacutter/capacity, 4500, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Cooldown Upgrade", /obj/item/upgrade/plasmacutter/cooldown, 5000, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Range Upgrade", /obj/item/upgrade/plasmacutter/range, 5000, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Ore Upgrade", /obj/item/upgrade/plasmacutter/ore, 10000, VENDING_UPGRADE), new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100, VENDING_UPGRADE), new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100, VENDING_UPGRADE), new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150, VENDING_UPGRADE), @@ -303,9 +307,12 @@ new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 1500, VENDING_WEAPON), new /datum/data/mining_equipment("Mini Plasma Cutter", /obj/item/gun/energy/plasmacutter/mini, 500, VENDING_WEAPON), new /datum/data/mining_equipment("Plasma Cutter" , /obj/item/gun/energy/plasmacutter, 2500, VENDING_WEAPON), - new /datum/data/mining_equipment("Plasma Cutter Shotgun", /obj/item/gun/energy/plasmacutter/scatter, 6000, VENDING_WEAPON), - new /datum/data/mining_equipment("PS Defuser Upgrade", /obj/item/upgrade/plasmacutter/defuser, 1000, VENDING_UPGRADE), - new /datum/data/mining_equipment("PS Capacity Upgrade", /obj/item/upgrade/plasmacutter/capacity, 4500, VENDING_UPGRADE), + new /datum/data/mining_equipment("Plasma Cutter Shotgun", /obj/item/gun/energy/plasmacutter/scatter, 5000, VENDING_WEAPON), + new /datum/data/mining_equipment("PC Defuser Upgrade", /obj/item/upgrade/plasmacutter/defuser, 1000, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Capacity Upgrade", /obj/item/upgrade/plasmacutter/capacity, 4500, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Cooldown Upgrade", /obj/item/upgrade/plasmacutter/cooldown, 5000, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Range Upgrade", /obj/item/upgrade/plasmacutter/range, 5000, VENDING_UPGRADE), + new /datum/data/mining_equipment("PC Ore Upgrade", /obj/item/upgrade/plasmacutter/ore, 10000, VENDING_UPGRADE), new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100, VENDING_UPGRADE), new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100, VENDING_UPGRADE), new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150, VENDING_UPGRADE), @@ -432,8 +439,8 @@ ..() /obj/item/card/mining_point_card/examine(mob/user) - ..() - to_chat(user, "There's [points] point\s on the card.") + . = ..() + . += "There's [points] point\s on the card." ///Conscript kit /obj/item/card/mining_access_card diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 9cc1e57931c7..44a220bca6f7 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -254,8 +254,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ statue.name = "bananium plated [statue.name]" statue.desc = "An incredibly lifelike bananium carving." statue.add_atom_colour("#ffd700", FIXED_COLOUR_PRIORITY) - statue.max_integrity = 9999 - statue.obj_integrity = 9999 + statue.modify_max_integrity(9999, can_break=FALSE) return TRUE /obj/item/stack/ore/titanium @@ -408,6 +407,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ force = 1 throwforce = 2 w_class = WEIGHT_CLASS_TINY + material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS var/string_attached var/list/sideslist = list("heads","tails") var/cmineral = null diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 26fc9cfcdddc..aaebee415016 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -27,6 +27,17 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/canUseStorage() return FALSE +/mob/dead/forceMove(atom/destination) + var/turf/old_turf = get_turf(src) + var/turf/new_turf = get_turf(destination) + if(is_secret_level(new_turf?.z) && (!client?.holder)) + return + if (old_turf?.z != new_turf?.z) + on_changed_z_level(old_turf, new_turf) + var/oldloc = loc + loc = destination + Moved(oldloc, NONE, TRUE) + /mob/dead/get_status_tab_items() . = ..() . += "" diff --git a/code/modules/mob/dead/new_player/latejoin_menu.dm b/code/modules/mob/dead/new_player/latejoin_menu.dm index 80dd13b9359a..6a46a49dc1cc 100644 --- a/code/modules/mob/dead/new_player/latejoin_menu.dm +++ b/code/modules/mob/dead/new_player/latejoin_menu.dm @@ -43,15 +43,10 @@ GLOBAL_DATUM_INIT(latejoin_menu, /datum/latejoin_menu, new) // FIXME: this can cause a runtime since user can be a living mob if(istype(user)) user.jobs_menu_mounted = FALSE - addtimer(CALLBACK(src, PROC_REF(scream_at_player), user), 5 SECONDS) ui = new(user, src, "JobSelection", "Latejoin Menu") ui.open() -/datum/latejoin_menu/proc/scream_at_player(mob/dead/new_player/player) - if(!player.jobs_menu_mounted) - to_chat(player, span_notice("If the late join menu isn't showing, you can open the fallback menu using the verb in the Preferences tab!")) - /datum/latejoin_menu/ui_data(mob/user) var/mob/dead/new_player/owner = user var/list/departments = list() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index b0f63caccdde..9edc926ccbbf 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -118,6 +118,9 @@ relevant_cap = max(hpc, epc) if(href_list["show_preferences"]) + if(!SSquirks.initialized) + to_chat(usr, span_notice("The game is still loading. Please wait a bit before editing your character.")) + return var/datum/preferences/preferences = client.prefs preferences.current_window = PREFERENCE_TAB_CHARACTER_PREFERENCES preferences.update_static_data(usr) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index eefa3e385051..bb0285e6db53 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -48,7 +48,10 @@ mannequin.add_overlay(mutable_appearance('icons/turf/floors.dmi', background, layer = SPACE_LAYER)) apply_prefs_to(mannequin, TRUE) + if(preview_job) + if(preview_job.forced_species) + mannequin.set_species(preview_job.forced_species) mannequin.job = preview_job.title mannequin.dress_up_as_job(preview_job, TRUE) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 79e62e6a0993..194071b2e66f 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -61,6 +61,7 @@ var/dimension_y = 32 var/limbs_id // The limbs id supplied for full-body replacing features. var/center = FALSE //Should we center the sprite? + var/emissive = FALSE //is this emissive? ////////////////////// // Hair Definitions // @@ -857,6 +858,7 @@ /datum/sprite_accessory/ipc_screens icon = 'icons/mob/ipc_accessories.dmi' color_src = EYECOLOR + emissive = TRUE /datum/sprite_accessory/ipc_screens/blue name = "Blue" @@ -875,6 +877,7 @@ /datum/sprite_accessory/ipc_screens/blank name = "Null" icon_state = "blank" + emissive = FALSE /datum/sprite_accessory/ipc_screens/console name = "Console" @@ -2242,6 +2245,7 @@ center = TRUE dimension_y = 34 locked = TRUE + emissive = TRUE /datum/sprite_accessory/wings_open/ethereal name = "Ethereal" @@ -2249,6 +2253,7 @@ dimension_x = 46 center = TRUE dimension_y = 34 + emissive = TRUE /datum/sprite_accessory/wings/etherealdetails name = "Etherealdetails" @@ -2258,6 +2263,7 @@ dimension_y = 34 locked = TRUE color_src = null + emissive = TRUE /datum/sprite_accessory/wings_open/etherealdetails name = "Etherealdetails" @@ -2266,6 +2272,7 @@ center = TRUE dimension_y = 34 color_src = null + emissive = TRUE /datum/sprite_accessory/wings/elytra name = "Elytra" @@ -2275,6 +2282,7 @@ dimension_y = 32 locked = TRUE color_src = EYECOLOR + emissive = TRUE /datum/sprite_accessory/wings_open/elytra name = "Elytra" @@ -2283,6 +2291,7 @@ center = TRUE dimension_y = 32 color_src = EYECOLOR + emissive = TRUE /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' @@ -2598,6 +2607,7 @@ /datum/sprite_accessory/ethereal_mark icon = 'icons/mob/mutant_bodyparts.dmi' color_src = EYECOLOR + emissive = TRUE /datum/sprite_accessory/ethereal_mark/eyes name = "Eyes" @@ -2717,6 +2727,7 @@ /datum/sprite_accessory/preternis_eye icon = 'icons/mob/mutant_bodyparts.dmi' color_src = EYECOLOR + emissive = TRUE /datum/sprite_accessory/preternis_eye/one name = "Standard" @@ -2754,6 +2765,7 @@ /datum/sprite_accessory/preternis_core icon = 'icons/mob/mutant_bodyparts.dmi' color_src = EYECOLOR + emissive = TRUE /datum/sprite_accessory/preternis_core/core name = "Core" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0205ef6b745b..6d6bc153d6d4 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -465,6 +465,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!istype(target) || (is_secret_level(target.z) && !client?.holder)) return + //shitcode override so that if you try to follow the AI, you'll get redirected to the AI eye where they're actually looking + if(isAI(target)) + var/mob/living/silicon/ai/ai_target = target + if(ai_target.eyeobj) + target = ai_target.eyeobj + var/icon/I = icon(target.icon,target.icon_state,target.dir) var/orbitsize = (I.Width()+I.Height())*0.5 @@ -576,9 +582,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost_others = client.prefs.read_preference(/datum/preference/choiced/ghost_others) //A quick update just in case this setting was changed right before calling the proc if (!ghostvision) - see_invisible = SEE_INVISIBLE_LIVING + set_invis_see(SEE_INVISIBLE_LIVING) else - see_invisible = SEE_INVISIBLE_OBSERVER + set_invis_see(SEE_INVISIBLE_OBSERVER) updateghostimages() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index a5e36af995ad..64b19a650c67 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -37,10 +37,11 @@ return "r" return "l" -/mob/proc/held_index_to_body_zone(i) +/// Returns HAND_LEFT or HAND_RIGHT based on whether the left or right hand is selected +/mob/proc/held_index_to_hand(i) if(!(i % 2)) - return BODY_ZONE_R_ARM - return BODY_ZONE_L_ARM + return HAND_RIGHT + return HAND_LEFT //Check we have an organ for this hand slot (Dismemberment), Only relevant for humans /mob/proc/has_hand_for_held_index(i) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 52d935f24f3e..ec755053510e 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -288,11 +288,18 @@ var/obj/item/clothing/head/hat = owner.get_item_by_slot(ITEM_SLOT_HEAD) if(hat && istype(hat, /obj/item/clothing/head/foilhat)) return + to_chat(owner, span_warning("Alert: Posibrain [severity > EMP_LIGHT ? "severely " : ""]damaged.")) owner.adjust_drugginess(5 * severity) if(severity > EMP_LIGHT) owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, (2 * (severity - EMP_LIGHT)) * (maxHealth - damage) / maxHealth) // don't give traumas from weak EMPs +/obj/item/organ/brain/positron/synth + zone = BODY_ZONE_HEAD + +/obj/item/organ/brain/positron/synth/can_extract() + return FALSE + ////////////////////////////////////TRAUMAS//////////////////////////////////////// /obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 11096fa37b3e..9fa97249ba40 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -116,6 +116,9 @@ playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, 0, -5) return ..() +/mob/living/carbon/alien/humanoid/get_butt_sprite() + return BUTT_SPRITE_XENOMORPH + /mob/living/carbon/alien/adult/proc/grab(mob/living/carbon/human/target) if(target.check_block()) target.visible_message(span_warning("[target] blocks [src]'s grab!"), \ diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 3a056f58facd..367be2785fc4 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -30,6 +30,13 @@ var/attached = 0 +/obj/item/clothing/mask/facehugger/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/item/clothing/mask/facehugger/lamarr name = "Lamarr" sterile = 1 @@ -46,11 +53,11 @@ /obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) ..() - if(obj_integrity < 90) + if(atom_integrity < 90) Die() /obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, params) - return O.attack_obj(src, user) + return O.attack_atom(src, user) /obj/item/clothing/mask/facehugger/attack_alien(mob/user) //can be picked up by aliens return attack_hand(user) @@ -91,8 +98,7 @@ . = ..() Attach(M) -/obj/item/clothing/mask/facehugger/Crossed(atom/target) - . = ..() +/obj/item/clothing/mask/facehugger/proc/on_entered(datum/source, atom/movable/target, ...) HasProximity(target) /obj/item/clothing/mask/facehugger/on_found(mob/finder) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 54235f77176e..3aa133a79355 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -177,6 +177,9 @@ if(HAS_TRAIT(src, TRAIT_PACIFISM)) to_chat(src, span_notice("You gently let go of [throwable_mob].")) return + if(!synth_check(src, SYNTH_ORGANIC_HARM)) + to_chat(src, span_notice("You gently let go of [throwable_mob].")) + return var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) if(start_T && end_T) @@ -190,6 +193,9 @@ if(HAS_TRAIT(src, TRAIT_PACIFISM) && I.throwforce) to_chat(src, span_notice("You set [I] down gently on the ground.")) return + if(!synth_check(src, SYNTH_RESTRICTED_WEAPON)) + to_chat(src, span_notice("You set [I] down gently on the ground.")) + return if(thrown_thing) if(HAS_TRAIT(src, TRAIT_HULK)) @@ -596,7 +602,7 @@ set_invis_see(min(glasses.invis_view, see_invisible)) if(!isnull(glasses.lighting_cutoff)) lighting_cutoff = max(lighting_cutoff, glasses.lighting_cutoff) - if(!isnull(glasses.color_cutoffs)) + if(length(glasses.color_cutoffs)) lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, glasses.color_cutoffs) @@ -984,6 +990,9 @@ var/obj/item/organ/I = X I.Insert(src) +/mob/living/carbon/proc/get_footprint_sprite() + return FOOTPRINT_SPRITE_PAWS + /mob/living/carbon/vv_get_dropdown() . = ..() VV_DROPDOWN_SEPERATOR diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8c802a160b03..0e08822fbc03 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -383,7 +383,7 @@ if(!(BP.emp_act(severity, emp_message) & EMP_PROTECT_SELF)) emp_message = FALSE // if the EMP was successful, don't spam the chat with more messages -/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, zone = BODY_ZONE_R_ARM, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE, gib = FALSE) +/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, zone = HANDS, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE, gib = FALSE) if(tesla_shock && (flags_1 & TESLA_IGNORE_1)) return FALSE if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE)) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 39c2d4f18ec9..8223aeb52ba3 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -40,7 +40,7 @@ var/obj/item/clothing/head = null var/obj/item/clothing/gloves = null //only used by humans - var/obj/item/clothing/shoes = null //only used by humans. + var/obj/item/clothing/shoes/shoes = null //only used by humans. var/obj/item/clothing/glasses/glasses = null //only used by humans. var/obj/item/clothing/ears = null //only used by humans. diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index a792a9639d5d..364a31ad4603 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -6,6 +6,8 @@ new /obj/effect/temp_visual/gib_animation(loc, "gibbed-r") if("plasma") new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h") //This will have more use in the near future + if("polysmorph") + new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") /mob/living/carbon/human/dust(just_ash, drop_items, force) if(drop_items) @@ -36,6 +38,8 @@ new /obj/effect/gibspawner/robot(get_turf(src)) if("plasma") new /obj/effect/gibspawner/human(get_turf(src), src, get_static_viruses()) + if("polysmorph") + new /obj/effect/gibspawner/xeno(get_turf(src), src, get_static_viruses()) else switch(dna.species.species_gibs) if("human") @@ -44,6 +48,8 @@ new /obj/effect/gibspawner/robot(get_turf(src)) if("plasma") new /obj/effect/gibspawner/human(get_turf(src), src, get_static_viruses()) + if("polysmorph") + new /obj/effect/gibspawner/xeno(get_turf(src), src, get_static_viruses()) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) if(just_ash) @@ -56,6 +62,8 @@ new /obj/effect/decal/remains/robot(loc) if("plasma") new /obj/effect/decal/remains/plasma(loc) + if("polysmorph") + new /obj/effect/decal/remains/xeno(loc) /mob/living/carbon/human/death(gibbed) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index adb3fd1e5883..702ec77bc5ad 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -401,9 +401,15 @@ msg += "[t_He] [t_is] barely conscious.\n" if(getorgan(/obj/item/organ/brain)) if(!key) - msg += "[span_deadsay("[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.")]\n" + if(is_synth(src)) + msg += "The unit is indicating that it is currently inactive. Place this unit inside a synthetic storage unit to allow the onboard synthetic intelligences to control it.\n" + else + msg += "[span_deadsay("[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.")]\n" else if(!client && !fake_client) - msg += "[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon.\n" + if(is_synth(src)) + msg += "The unit is indicating that it is currently inactive. Place this unit inside a synthetic storage unit to allow the onboard synthetic intelligences to control it.\n" + else + msg += "[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon.\n" if(digitalcamo) msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index be2381ed21bd..e7efa3bc9193 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -35,7 +35,11 @@ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(clean_face)) AddComponent(/datum/component/personal_crafting) AddElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) - AddComponent(/datum/component/bloodysoles/feet) + AddComponent(/datum/component/bloodysoles/feet, FOOTPRINT_SPRITE_SHOES) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) /mob/living/carbon/human/proc/setup_human_dna() //initialize dna. for spawned humans; overwritten by other code @@ -260,12 +264,11 @@ // called when something steps onto a human // this could be made more general, but for now just handle mulebot -/mob/living/carbon/human/Crossed(atom/movable/AM) +/mob/living/carbon/human/proc/on_entered(datum/source, atom/movable/AM, ...) var/mob/living/simple_animal/bot/mulebot/MB = AM if(istype(MB)) MB.RunOver(src) - . = ..() spreadFire(AM) /mob/living/carbon/human/Topic(href, href_list) @@ -547,6 +550,14 @@ // Might need re-wording. to_chat(user, span_alert("There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"].")) +/mob/living/carbon/human/get_butt_sprite() + return dna?.species?.get_butt_sprite(src) + +/mob/living/carbon/human/get_footprint_sprite() + var/obj/item/bodypart/l_leg/left_leg = get_bodypart(BODY_ZONE_L_LEG) + var/obj/item/bodypart/r_leg/right_leg = get_bodypart(BODY_ZONE_R_LEG) + return shoes?.footprint_sprite || left_leg?.footprint_sprite || right_leg?.footprint_sprite + /mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) if(judgement_criteria & JUDGE_EMAGGED) return 10 //Everyone is a criminal! @@ -718,7 +729,7 @@ /mob/living/carbon/human/cuff_resist(obj/item/I) if(dna && (dna.check_mutation(HULK))) - say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") + say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ), forced = "hulk") if(..(I, cuff_break = FAST_CUFFBREAK)) dropItemToGround(I) else @@ -1379,12 +1390,6 @@ /mob/living/carbon/human/species/skeleton/lowcalcium race = /datum/species/skeleton/lowcalcium -/mob/living/carbon/human/species/synth - race = /datum/species/synth - -/mob/living/carbon/human/species/synth/military - race = /datum/species/synth/military - /mob/living/carbon/human/species/vampire race = /datum/species/vampire diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index cdf73b751d74..e91d3484b4b3 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -1,53 +1,40 @@ /mob/living/carbon/human/getarmor(def_zone, type) - var/armorval = 0 - var/organnum = 0 - if(def_zone) - if(isbodypart(def_zone)) - var/obj/item/bodypart/bp = def_zone - if(bp) - return checkarmor(def_zone, type) - var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone)) - if(affecting) - return checkarmor(affecting, type) + if(isnum(def_zone)) // allows using bodypart bitflags instead of zones + return checkarmor(def_zone, type) + var/obj/item/bodypart/affecting = isbodypart(def_zone) ? def_zone : get_bodypart(check_zone(def_zone)) + return checkarmor(affecting.body_part, type) //If a specific bodypart is targetted, check how that bodypart is protected and return the value. //If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - armorval += min(checkarmor(BP, type), 100) // hey no you can't do that + var/armorval = 0 + var/organnum = 0 + for(var/obj/item/bodypart/limb as anything in bodyparts) + armorval += min(checkarmor(limb.body_part, type), 100) // hey no you can't do that organnum++ return (armorval/max(organnum, 1)) -/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, d_type) - if(!d_type) +/mob/living/carbon/human/proc/checkarmor(bodypart_flag, armor_flag) + if(!armor_flag) return 0 var/protection = 0 var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) - for(var/bp in body_parts) - if(!bp) - continue - if(bp && istype(bp , /obj/item/clothing)) - var/obj/item/clothing/C = bp - if(def_zone.body_part & C.body_parts_covered) - protection += C.armor.getRating(d_type) - else if(C.body_parts_partial_covered & def_zone.body_part) - protection += C.armor.getRating(d_type) * 0.5 - protection += physiology.armor.getRating(d_type) + for(var/obj/item/clothing/cover in body_parts) + if(bodypart_flag & cover.body_parts_covered) + protection += cover.armor.getRating(armor_flag) + else if(bodypart_flag & cover.body_parts_partial_covered) + protection += cover.armor.getRating(armor_flag) * 0.5 + protection += physiology.armor.getRating(armor_flag) return protection ///Get all the clothing on a specific body part -/mob/living/carbon/human/proc/clothingonpart(obj/item/bodypart/def_zone) +/mob/living/carbon/human/proc/clothingonpart(bodypart_flag) var/list/covering_part = list() var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) - for(var/bp in body_parts) - if(!bp) - continue - if(bp && istype(bp , /obj/item/clothing)) - var/obj/item/clothing/C = bp - if(def_zone.body_part & C.body_parts_covered) - covering_part += C + for(var/obj/item/clothing/cover in body_parts) + if(bodypart_flag & cover.body_parts_covered) + covering_part += cover return covering_part /mob/living/carbon/human/on_hit(obj/projectile/P) @@ -203,7 +190,7 @@ var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target if(affecting) if(I.force && I.damtype != STAMINA && affecting.status == BODYPART_ROBOTIC) // Bodpart_robotic sparks when hit, but only when it does real damage - if(I.force >= 5) + if(I.force >= 5 && !isinsurgent(src)) //small change, insurgent ipcs don't give off sparks if hit do_sparks(1, FALSE, loc) SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) @@ -386,7 +373,7 @@ var/armor_block = run_armor_check(affecting, MELEE) apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod) -/mob/living/carbon/human/mech_melee_attack(obj/mecha/M, equip_allowed) +/mob/living/carbon/human/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) if(M.selected?.melee_override && equip_allowed) M.selected.action(src) else if(M.occupant.a_intent == INTENT_HARM) @@ -505,7 +492,7 @@ //Added a safety check in case you want to shock a human mob directly through electrocute_act. -/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, zone = BODY_ZONE_R_ARM, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE, gib = FALSE) +/mob/living/carbon/human/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, zone = HANDS, override = FALSE, tesla_shock = FALSE, illusion = FALSE, stun = TRUE, gib = FALSE) if(!override) siemens_coeff *= physiology.siemens_coeff . = ..() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index be7e3397cb18..d355358819d2 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -36,6 +36,8 @@ GLOBAL_LIST_EMPTY(features_by_species) /// does it use skintones or not? (spoiler alert this is only used by humans) var/use_skintones = FALSE + var/forced_skintone + /// If your race wants to bleed something other than bog standard blood, change this to reagent id. var/datum/reagent/exotic_blood ///If your race uses a non standard bloodtype (A+, O-, AB-, etc) @@ -121,6 +123,8 @@ GLOBAL_LIST_EMPTY(features_by_species) var/inert_mutation = DWARFISM ///used to set the mobs deathsound on species change var/deathsound + ///Barefoot step sound + var/barefoot_step_sound = FOOTSTEP_MOB_BAREFOOT ///Sounds to override barefeet walking var/list/special_step_sounds ///How loud to play the step override @@ -131,6 +135,8 @@ GLOBAL_LIST_EMPTY(features_by_species) var/grab_sound ///yogs - audio of a species' scream var/screamsound + /// The visual effect of the attack. + var/attack_effect = ATTACK_EFFECT_PUNCH ///is a flying species, just a check for some things var/flying_species = FALSE ///the actual flying ability given to flying species @@ -207,6 +213,10 @@ GLOBAL_LIST_EMPTY(features_by_species) //Should we preload this species's organs? var/preload = TRUE + var/inherent_slowdown = 0 + + //for preternis + synths + var/draining = FALSE ///Does our species have colors for its' damage overlays? var/use_damage_color = TRUE @@ -318,6 +328,10 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/has_toes() return FALSE +/// Sprite to show for photocopying mob butts +/datum/species/proc/get_butt_sprite(mob/living/carbon/human/human) + return human.gender == FEMALE ? BUTT_SPRITE_HUMAN_FEMALE : BUTT_SPRITE_HUMAN_MALE + /** * Corrects organs in a carbon, removing ones it doesn't need and adding ones it does. * @@ -916,6 +930,10 @@ GLOBAL_LIST_EMPTY(features_by_species) if((H.wear_mask && (H.wear_mask.flags_inv & HIDEEYES)) || (H.head && (H.head.flags_inv & HIDEEYES)) || !HD) bodyparts_to_add -= "preternis_eye" + if("preternis_core" in mutant_bodyparts) + if(H.w_uniform || H.wear_suit) + bodyparts_to_add -= "preternis_core" + if("pod_hair" in mutant_bodyparts) if((H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || (H.head && (H.head.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC) bodyparts_to_add -= "pod_hair" @@ -1082,6 +1100,42 @@ GLOBAL_LIST_EMPTY(features_by_species) accessory_overlay.color = forced_colour standing += accessory_overlay + if(S.emissive && !(HAS_TRAIT(H, TRAIT_HUSK)) && !istype(H, /mob/living/carbon/human/dummy))//don't put emissives on dummy mobs as they're used for the preference menu, which doesn't draw emissives properly + var/mutable_appearance/emissive_accessory_overlay = emissive_appearance(S.icon, "placeholder", H) + + //A little rename so we don't have to use tail_lizard or tail_human when naming the sprites. + if(S.gender_specific) + emissive_accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]" + else + emissive_accessory_overlay.icon_state = "m_[bodypart]_[S.icon_state]_[layertext]" + + if(S.center) + emissive_accessory_overlay = center_image(emissive_accessory_overlay, S.dimension_x, S.dimension_y) + + if(!forced_colour) + switch(S.color_src) + if(MUTCOLORS) + if(H.dna.check_mutation(HULK)) //HULK GO FIRST + emissive_accessory_overlay.color = "#00aa00" + else if(fixed_mut_color) //Then fixed color if applicable + emissive_accessory_overlay.color = fixed_mut_color + else //Then snowflake color + emissive_accessory_overlay.color = H.dna.features["mcolor"] + if(HAIR) + if(hair_color == "mutcolor") + emissive_accessory_overlay.color = H.dna.features["mcolor"] + else if(hair_color == "fixedmutcolor") + emissive_accessory_overlay.color = fixed_mut_color + else + emissive_accessory_overlay.color = H.hair_color + if(FACEHAIR) + emissive_accessory_overlay.color = H.facial_hair_color + if(EYECOLOR) + emissive_accessory_overlay.color = H.eye_color + else + emissive_accessory_overlay.color = forced_colour + standing += emissive_accessory_overlay + if(S.hasinner) var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer) if(S.gender_specific) @@ -1539,6 +1593,8 @@ GLOBAL_LIST_EMPTY(features_by_species) . += hungry / 50 //Moving in high gravity is very slow (Flying too) + . += inherent_slowdown + if(gravity > STANDARD_GRAVITY) var/grav_force = min(gravity - STANDARD_GRAVITY,3) . += 1 + grav_force @@ -1599,6 +1655,9 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!attacker_style?.nonlethal && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm [target]!")) return FALSE + if(!synth_check(user, SYNTH_ORGANIC_HARM)) + to_chat(user, span_warning("You don't want to harm [target]!")) + return var/datum/martial_art/M = target.check_block() if(M) M.handle_counter(target, user) @@ -1608,26 +1667,18 @@ GLOBAL_LIST_EMPTY(features_by_species) else var/atk_verb = user.dna.species.attack_verb + var/atk_effect = user.dna.species.attack_effect if(!(target.mobility_flags & MOBILITY_STAND)) - atk_verb = ATTACK_EFFECT_KICK - - switch(atk_verb)//this code is really stupid but some genius apparently made "claw" and "slash" two attack types but also the same one so it's needed i guess - if(ATTACK_EFFECT_KICK) - user.do_attack_animation(target, ATTACK_EFFECT_KICK) - if(ATTACK_EFFECT_SLASH, ATTACK_EFFECT_CLAW)//smh - user.do_attack_animation(target, ATTACK_EFFECT_CLAW) - if(ATTACK_EFFECT_SMASH) - user.do_attack_animation(target, ATTACK_EFFECT_SMASH) - else - user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) - + atk_verb = "kick" + atk_effect = ATTACK_EFFECT_KICK + user.do_attack_animation(target, atk_effect) var/damage = rand(user.get_punchdamagelow(), user.get_punchdamagehigh()) var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected)) var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases if(user.get_punchdamagelow()) - if(atk_verb == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage) + if(atk_effect == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage) miss_chance = 0 else miss_chance = min((user.get_punchdamagelow()/user.get_punchdamagehigh()) + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 100) //old base chance for a miss + various damage. capped at 100 to prevent weirdness in prob() @@ -1654,7 +1705,7 @@ GLOBAL_LIST_EMPTY(features_by_species) target.dismembering_strike(user, affecting.body_zone) var/attack_direction = get_dir(user, target) - if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage target.apply_damage(damage*1.5, user.dna.species.attack_type, affecting, armor_block, attack_direction = attack_direction) log_combat(user, target, "kicked") else//other attacks deal full raw damage + 1.5x in stamina damage diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index e22d4936abc7..a60451f5fd63 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -59,7 +59,7 @@ var/ipc_name = "[pick(GLOB.posibrain_names)]-[rand(100, 999)]" return ipc_name -/datum/species/ipc/on_species_gain(mob/living/carbon/C) // Let's make that IPC actually robotic. +/datum/species/ipc/on_species_gain(mob/living/carbon/C, datum/species/old_species) // Let's make that IPC actually robotic. . = ..() C.particles = new /particles/smoke/ipc() var/obj/item/organ/appendix/A = C.getorganslot(ORGAN_SLOT_APPENDIX) // Easiest way to remove it. @@ -219,6 +219,9 @@ break H.visible_message("[H] unplugs from the [A].", "You unplug from the [A].") +/datum/species/ipc/get_butt_sprite() + return BUTT_SPRITE_QR_CODE + /datum/species/ipc/spec_revival(mob/living/carbon/human/H, admin_revive) if(admin_revive) if(saved_screen) @@ -363,4 +366,143 @@ ipc martial arts stuff return TRUE return FALSE + +/* +* S.E.L.F. movement specific IPCs +*/ +/datum/species/ipc/self + id = "self ipc" + limbs_id = "mcgipc" + speedmod = -0.1 + armor = 10 + punchdamagelow = 5 + punchdamagehigh = 12 + punchstunthreshold = 12 + inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOBREATH,TRAIT_LIMBATTACHMENT,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOCRITDAMAGE,TRAIT_GENELESS,TRAIT_MEDICALIGNORE,TRAIT_NOCLONE,TRAIT_TOXIMMUNE,TRAIT_EASILY_WOUNDED,TRAIT_NODEFIB,TRAIT_POWERHUNGRY) + +//infiltrators +/datum/species/ipc/self/insurgent + id = "self insurgent" + var/disguise_fail_health = 65 //When their health gets to this level their synthflesh partially falls off + var/datum/species/fake_species //a species to do most of our work for us, unless we're damaged + var/list/initial_species_traits //for getting these values back for assume_disguise() + var/list/initial_inherent_traits + var/list/initial_mutant_bodyparts + var/list/initial_step_sounds + var/list/initial_walk_sounds + var/list/blacklisted_species = list(/datum/species/ethereal, /datum/species/moth)//species that really don't work with this system (lizards aren't quite right either, but whatever) + var/list/old_features + var/ipc_color + var/disguised = FALSE + +/datum/species/ipc/self/insurgent/New() + initial_species_traits = LAZYCOPY(species_traits) + initial_inherent_traits = LAZYCOPY(inherent_traits) + initial_mutant_bodyparts = LAZYCOPY(mutant_bodyparts) + initial_step_sounds = LAZYCOPY(special_step_sounds) + initial_walk_sounds = LAZYCOPY(special_walk_sounds) + ipc_color = sanitize_hexcolor("[pick("7F", "FF")][pick("7F", "FF")][pick("7F", "FF")]") + + fake_species = new /datum/species/human() //default is human + ..() + +/datum/species/ipc/self/insurgent/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) + old_features = LAZYCOPY(H.dna.features) + if(old_species && !is_type_in_list(old_species, blacklisted_species)) + qdel(fake_species) + fake_species = old_species + if(old_species.use_skintones) + old_features["mcolor"] = skintone2hex(H.skin_tone) + else + old_features["mcolor"] = skintone2hex(random_skin_tone()) + ..() + for(var/obj/item/bodypart/O in H.bodyparts) + O.render_like_organic = TRUE // Makes limbs render like organic limbs instead of augmented limbs, check bodyparts.dm + assume_disguise(H) + +/datum/species/ipc/self/insurgent/spec_fully_heal(mob/living/carbon/human/H) + assume_disguise(H) + +/datum/species/ipc/self/insurgent/proc/assume_disguise(mob/living/carbon/human/H) + if(disguised || !(fake_species && istype(fake_species)) || H.health < disguise_fail_health) + return FALSE + + disguised = TRUE + name = fake_species.name + say_mod = fake_species.say_mod + sexes = fake_species.sexes + species_traits = LAZYCOPY(initial_species_traits) + inherent_traits = LAZYCOPY(initial_inherent_traits) + mutant_bodyparts = LAZYCOPY(fake_species.mutant_bodyparts) + H.dna.features = old_features + special_step_sounds = null + special_walk_sounds = null + species_traits |= fake_species.species_traits + inherent_traits |= fake_species.inherent_traits + if(!(NO_UNDERWEAR in fake_species.species_traits)) + species_traits -= NO_UNDERWEAR + damage_overlay_type = fake_species.damage_overlay_type + attack_verb = fake_species.attack_verb + attack_effect = fake_species.attack_effect + attack_sound = fake_species.attack_sound + miss_sound = fake_species.miss_sound + nojumpsuit = fake_species.nojumpsuit + limbs_id = fake_species.limbs_id + use_skintones = fake_species.use_skintones + fixed_mut_color = fake_species.fixed_mut_color + bubble_icon = fake_species.bubble_icon + yogs_draw_robot_hair = TRUE + + H.regenerate_icons() //to update limb icon cache with the new damage overlays + +/datum/species/ipc/self/insurgent/proc/break_disguise(mob/living/carbon/human/H) + if(!disguised) + return FALSE + disguised = FALSE + name = initial(name) + say_mod = initial(say_mod) + sexes = initial(sexes) + species_traits = LAZYCOPY(initial_species_traits) + inherent_traits = LAZYCOPY(initial_inherent_traits) + mutant_bodyparts = LAZYCOPY(initial_mutant_bodyparts) + special_step_sounds = LAZYCOPY(initial_step_sounds) + special_walk_sounds = LAZYCOPY(initial_walk_sounds) + damage_overlay_type = initial(damage_overlay_type) + H.dna.features["mcolor"] = ipc_color + attack_verb = initial(attack_verb) + attack_effect = initial(attack_effect) + attack_sound = initial(attack_sound) + miss_sound = initial(miss_sound) + nojumpsuit = initial(nojumpsuit) + limbs_id = initial(limbs_id) + use_skintones = initial(use_skintones) + bubble_icon = initial(bubble_icon) + yogs_draw_robot_hair = FALSE + + for(var/obj/item/bodypart/O in H.bodyparts) + O.render_like_organic = TRUE // Makes limbs render like organic limbs instead of augmented limbs, check bodyparts.dm + H.regenerate_icons() + +/datum/species/ipc/self/insurgent/get_scream_sound(mob/living/carbon/human/H) + if(fake_species && disguised) + return fake_species.get_scream_sound(H) + else + return ..() + +/datum/species/ipc/self/insurgent/apply_damage(damage, damagetype, def_zone, blocked, mob/living/carbon/human/H, wound_bonus, bare_wound_bonus, sharpness, attack_direction) + . = ..() + if(. && H.health < disguise_fail_health) + break_disguise(H) + +//admeme strong ipc +/datum/species/ipc/self/insurgent/military + id = "insurrectionist ipc" + armor = 35 + speedmod = -0.2 + punchdamagelow = 10 + punchdamagehigh = 19 + punchstunthreshold = 14 //about 50% chance to stun + disguise_fail_health = 35 + changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN //admin only... sorta + #undef CONSCIOUSAY diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index c8862226ec77..77d8396a5b85 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -17,3 +17,6 @@ . = ..() var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] abductor_hud.hide_from(C) + +/datum/species/abductor/get_butt_sprite() + return BUTT_SPRITE_GREY diff --git a/code/modules/mob/living/carbon/human/species_types/eggpeople.dm b/code/modules/mob/living/carbon/human/species_types/eggpeople.dm index f31799f0ec0e..dd56caf9b838 100644 --- a/code/modules/mob/living/carbon/human/species_types/eggpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/eggpeople.dm @@ -16,6 +16,7 @@ default_features = list() changesource_flags = MIRROR_BADMIN | SLIME_EXTRACT | MIRROR_PRIDE | MIRROR_MAGIC attack_verb = "slash" + attack_effect = ATTACK_EFFECT_CLAW attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/omelette diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 26800f54fcf6..459d80b9bfd9 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -4,6 +4,7 @@ id = "felinid" limbs_id = "human" attack_verb = "slash" + attack_effect = ATTACK_EFFECT_CLAW attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' 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 336b28ded8bf..64ff9876d585 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -222,6 +222,7 @@ meat = /obj/item/stack/ore/iron info_text = "As a Plasteel Golem, you are slower, but harder to stun, and hit very hard when punching. You also magnetically attach to surfaces and so don't float without gravity and cannot have positions swapped with other beings." attack_verb = "smash" + attack_effect = ATTACK_EFFECT_SMASH attack_sound = 'sound/effects/meteorimpact.ogg' //hits pretty hard prefix = "Plasteel" special_names = null @@ -733,6 +734,7 @@ species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,NOFLASH) armor = 20 //Reinforced, but much less so to allow for fast movement attack_verb = "smash" + attack_effect = ATTACK_EFFECT_SMASH attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg' sexes = FALSE speedmod = 0 diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index f76826f86652..ab14f4db910c 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -22,6 +22,11 @@ /datum/species/human/has_toes() return TRUE +/datum/species/human/get_butt_sprite(mob/living/carbon/human/human) + var/butt_sprite = human.gender == FEMALE ? BUTT_SPRITE_HUMAN_FEMALE : BUTT_SPRITE_HUMAN_MALE + var/obj/item/organ/tail/tail = human.getorganslot(ORGAN_SLOT_TAIL) + return tail?.get_butt_sprite() || butt_sprite + /datum/species/human/get_scream_sound(mob/living/carbon/human/H) if(H.gender == FEMALE) return pick(female_screams) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index f1cfac0ca393..adf64859a59c 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -84,6 +84,9 @@ ""//"TODO: RIP in peace Skrem" ) +/datum/species/jelly/get_butt_sprite() + return BUTT_SPRITE_SLIME + /datum/species/jelly/create_pref_unique_perks() var/list/to_add = list() diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 3931d56bb2a9..fa47a5894b8e 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -18,6 +18,8 @@ default_features = list("mcolor" = "#00FF00", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT attack_verb = "slash" + attack_effect = ATTACK_EFFECT_CLAW + barefoot_step_sound = FOOTSTEP_MOB_CLAW attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard @@ -74,6 +76,9 @@ else if(H.has_movespeed_modifier(LIZARD_SLOWDOWN)) H.remove_movespeed_modifier(LIZARD_SLOWDOWN) +/datum/species/lizard/get_butt_sprite() + return BUTT_SPRITE_LIZARD + /datum/species/lizard/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) . = ..() C.remove_movespeed_modifier(LIZARD_SLOWDOWN) diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index b9e726d8908d..db1c98fa2a71 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -9,6 +9,7 @@ mutant_bodyparts = list("moth_wings") default_features = list("moth_wings" = "Plain") attack_verb = "slash" + attack_effect = ATTACK_EFFECT_CLAW attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth @@ -44,6 +45,9 @@ return randname +/datum/species/moth/get_butt_sprite() + return BUTT_SPRITE_FUZZY + /datum/species/moth/handle_fire(mob/living/carbon/human/H, no_protection = FALSE) . = ..() if(.) //if the mob is immune to fire, don't burn wings off. diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index b22479775cc2..bc9cea38e847 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -15,6 +15,7 @@ mutanttongue = /obj/item/organ/tongue/bone/plasmaman mutantliver = /obj/item/organ/liver/plasmaman mutantstomach = /obj/item/organ/stomach/plasmaman + barefoot_step_sound = FOOTSTEP_MOB_CLAW brutemod = 1.3 //Rattle me bones, but less because plasma bones are very hard burnmod = 0.9 //Plasma is a surprisingly good insulator if not around oxygen heatmod = 1.5 //Don't let the plasma actually heat up though @@ -71,6 +72,8 @@ . = ..() /datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE) + if(!J) + return var/current_job = J.title var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman switch(current_job) @@ -199,6 +202,9 @@ return randname +/datum/species/plasmaman/get_butt_sprite() + return BUTT_SPRITE_PLASMA + /datum/species/plasmaman/get_species_description() return "Reanimated skeletons of those who died in plasma fires, plasmamen are the first alien sapient beings to be \ discovered, even though they're mainly former humans. While horrifying, most manage to return to their previous position in society before their transformation." diff --git a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm index d6f44556a682..235923247025 100644 --- a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm +++ b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm @@ -25,6 +25,7 @@ punchdamagehigh = 11 //slightly better high end of damage punchstunthreshold = 11 //technically slightly worse stunchance damage_overlay_type = "polysmorph" + species_gibs = "polysmorph" deathsound = 'sound/voice/hiss6.ogg' screamsound = 'sound/voice/hiss5.ogg' mutanteyes = /obj/item/organ/eyes/polysmorph @@ -33,6 +34,8 @@ mutanttail = /obj/item/organ/tail/polysmorph mutantlungs = /obj/item/organ/lungs/xeno attack_verb = "slash" + barefoot_step_sound = FOOTSTEP_MOB_CLAW + attack_effect = ATTACK_EFFECT_CLAW attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' fixed_mut_color = "#444466" //don't mess with this if you don't feel like manually adjusting the mutant bodypart sprites @@ -61,6 +64,9 @@ if(C.physiology) C.physiology.armor.wound -= 5 +/datum/species/polysmorph/get_butt_sprite() + return BUTT_SPRITE_XENOMORPH + /datum/species/polysmorph/get_species_description() return ""//"TODO: This is polysmorph description" diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index 3ac2e8fb0df2..94937184b1d2 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -9,6 +9,7 @@ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH, TRAIT_CALCIUM_HEALER) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutanttongue = /obj/item/organ/tongue/bone + barefoot_step_sound = FOOTSTEP_MOB_CLAW damage_overlay_type = ""//let's not show bloody wounds or burns over bones. wings_icon = "Skeleton" disliked_food = NONE 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 2ae3e3999e6c..ab3c9413c5da 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -7,6 +7,7 @@ species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) inherent_traits = list(TRAIT_ALWAYS_CLEAN) attack_verb = "slap" + attack_effect = ATTACK_EFFECT_DISARM say_mod = "slurs" coldmod = 0.5 //snails only come out when its cold and wet burnmod = 2 diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm deleted file mode 100644 index 9f450647bd6d..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ /dev/null @@ -1,150 +0,0 @@ -/datum/species/synth - name = "Synth" //inherited from the real species, for health scanners and things - id = "synth" - say_mod = "beep boops" //inherited from a user's real species - sexes = FALSE - species_traits = list(NO_DNA_COPY, NOTRANSSTING, AGENDER) //all of these + whatever we inherit from the real species - inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_RADIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH) - inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID - meat = null - damage_overlay_type = "synth" - limbs_id = "synth" - mutantbrain = /obj/item/organ/brain/positron // needs synthetic organs - mutantheart = /obj/item/organ/heart/cybernetic/ipc - mutanteyes = /obj/item/organ/eyes/robotic - mutanttongue = /obj/item/organ/tongue/robot - mutantliver = /obj/item/organ/liver/cybernetic/upgraded/ipc - mutantstomach = /obj/item/organ/stomach/cell - mutantears = /obj/item/organ/ears/robot - mutantlungs = /obj/item/organ/lungs/ipc - var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off - var/datum/species/fake_species //a species to do most of our work for us, unless we're damaged - var/list/initial_species_traits //for getting these values back for assume_disguise() - var/list/initial_inherent_traits - changesource_flags = MIRROR_BADMIN | WABBAJACK | SLIME_EXTRACT//Yogs -- Slime_extract - species_language_holder = /datum/language_holder/synthetic - - -/datum/species/synth/New() - initial_species_traits = species_traits.Copy() - initial_inherent_traits = inherent_traits.Copy() - ..() - -/datum/species/synth/military - name = "Military Synth" - id = "military_synth" - armor = 25 - punchdamagelow = 10 - punchdamagehigh = 19 - punchstunthreshold = 14 //about 50% chance to stun - disguise_fail_health = 50 - -/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) - ..() - assume_disguise(old_species, H) - RegisterSignal(H, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/species/synth/on_species_loss(mob/living/carbon/human/H) - . = ..() - UnregisterSignal(H, COMSIG_MOB_SAY) - -/datum/species/synth/proc/assume_disguise(datum/species/S, mob/living/carbon/human/H) - if(S && !istype(S, type)) - name = S.name - say_mod = S.say_mod - sexes = S.sexes - species_traits = initial_species_traits.Copy() - inherent_traits = initial_inherent_traits.Copy() - species_traits |= S.species_traits - inherent_traits |= S.inherent_traits - attack_verb = S.attack_verb - attack_sound = S.attack_sound - miss_sound = S.miss_sound - meat = S.meat - mutant_bodyparts = S.mutant_bodyparts.Copy() - mutant_organs = S.mutant_organs.Copy() - default_features = S.default_features.Copy() - nojumpsuit = S.nojumpsuit - no_equip = S.no_equip.Copy() - limbs_id = S.limbs_id - use_skintones = S.use_skintones - fixed_mut_color = S.fixed_mut_color - hair_color = S.hair_color - fake_species = new S.type - else - name = initial(name) - say_mod = initial(say_mod) - species_traits = initial_species_traits.Copy() - inherent_traits = initial_inherent_traits.Copy() - attack_verb = initial(attack_verb) - attack_sound = initial(attack_sound) - miss_sound = initial(miss_sound) - mutant_bodyparts = list() - default_features = list() - nojumpsuit = initial(nojumpsuit) - no_equip = list() - qdel(fake_species) - fake_species = null - meat = initial(meat) - limbs_id = "synth" - use_skintones = 0 - sexes = FALSE - fixed_mut_color = "" - hair_color = "" - - for(var/X in H.bodyparts) //propagates the damage_overlay changes - var/obj/item/bodypart/BP = X - BP.update_limb() - H.update_body_parts() //to update limb icon cache with the new damage overlays - -//Proc redirects: -//Passing procs onto the fake_species, to ensure we look as much like them as possible - -/datum/species/synth/handle_hair(mob/living/carbon/human/H, forced_colour) - if(fake_species) - fake_species.handle_hair(H, forced_colour) - else - return ..() - - -/datum/species/synth/handle_body(mob/living/carbon/human/H) - if(fake_species) - fake_species.handle_body(H) - else - return ..() - - -/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) - if(fake_species) - fake_species.handle_body(H,forced_colour) - else - return ..() - - -/datum/species/synth/proc/handle_speech(datum/source, list/speech_args) - if (isliving(source)) // yeah it's gonna be living but just to be clean - var/mob/living/L = source - if(fake_species && L.health > disguise_fail_health) - switch (fake_species.type) - if (/datum/species/golem/bananium) - speech_args[SPEECH_SPANS] |= SPAN_CLOWN - if (/datum/species/golem/clockwork) - speech_args[SPEECH_SPANS] |= SPAN_ROBOT - -/datum/species/synth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) - . = ..() - - if(H.reagents.has_reagent(/datum/reagent/teslium,10)) //10 u otherwise it wont update and they will remain quikk - H.add_movespeed_modifier("preternis_teslium", update=TRUE, priority=101, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) - if(H.health < 50 && H.health > 0) - H.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) - H.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) - H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) - H.AdjustParalyzed(-3) - H.AdjustStun(-3) - H.AdjustKnockdown(-3) - H.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER) - burnmod = 200 - else - H.remove_movespeed_modifier("preternis_teslium") - burnmod = initial(burnmod) diff --git a/code/modules/mob/living/carbon/human/species_types/wy_synths.dm b/code/modules/mob/living/carbon/human/species_types/wy_synths.dm new file mode 100644 index 000000000000..bc69f2378b41 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/wy_synths.dm @@ -0,0 +1,315 @@ +#define CONCIOUSAY(text) if(H.stat == CONSCIOUS) { ##text } + +/datum/species/wy_synth + name = "Synthetic" + id = "synthetic" + say_mod = "states" + + limbs_id = "human" + damage_overlay_type = "synth" + + species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,TRAIT_EASYDISMEMBER,NOZOMBIE,NOHUSK,NOBLOOD, NO_UNDERWEAR) + inherent_traits = list(TRAIT_POWERHUNGRY, TRAIT_NOBREATH, TRAIT_RADIMMUNE,TRAIT_COLDBLOODED,TRAIT_LIMBATTACHMENT,TRAIT_NOCRITDAMAGE,TRAIT_GENELESS,TRAIT_MEDICALIGNORE,TRAIT_NOCLONE,TRAIT_TOXIMMUNE,TRAIT_EASILY_WOUNDED,TRAIT_NODEFIB, TRAIT_REDUCED_DAMAGE_SLOWDOWN, TRAIT_NOGUNS, TRAIT_NO_GRENADES) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_EYES) + inherent_biotypes = list(MOB_ROBOTIC) + mutantbrain = /obj/item/organ/brain/positron/synth + mutantheart = /obj/item/organ/heart/cybernetic + mutanteyes = /obj/item/organ/eyes/robotic/synth + mutanttongue = /obj/item/organ/tongue/robot + mutantliver = /obj/item/organ/liver/cybernetic/upgraded + mutantstomach = /obj/item/organ/stomach/cell + mutantears = /obj/item/organ/ears/robot + mutantlungs = /obj/item/organ/lungs + meat = /obj/item/stack/sheet/plasteel{amount = 5} + skinned_type = /obj/item/stack/sheet/metal{amount = 10} + exotic_blood = /datum/reagent/oil + use_skintones = TRUE + forced_skintone = "albino" + inherent_biotypes = MOB_ROBOTIC + + burnmod = 0.9 + heatmod = 0.95 + brutemod = 0.75 + toxmod = 0 + clonemod = 0 + staminamod = 0.5 + coldmod = 0.25 //You take less cold damage + siemens_coeff = 1.75 + species_gibs = "robotic" + attack_sound = 'sound/items/trayhit1.ogg' + screamsound = 'goon/sound/robot_scream.ogg' + allow_numbers_in_name = TRUE + deathsound = 'sound/voice/borg_deathsound.ogg' + wings_icon = "Robotic" + changesource_flags = MIRROR_BADMIN + + var/datum/action/innate/undeployment_synth/undeployment_action = new + ///For transferring back and forth to an AI body when it's the AI deploying + var/mob/living/silicon/ai/mainframe + + inherent_slowdown = 0.65 + var/datum/action/innate/synth_os/os_button = new + var/datum/action/innate/synth_laws/show_laws = new + + + ///Original synth number designation for when this shell becomes uninhabited + var/original_numbers + + var/obj/item/ai_cpu/inbuilt_cpu + + punchdamagehigh = 12 + punchdamagelow = 5 + punchstunthreshold = 11 + var/force_multiplier = 1.25 //We hit 25% harder with all weapons + + var/last_warned + + var/datum/ai_laws/laws = null + + species_language_holder = /datum/language_holder/machine + + +/datum/species/wy_synth/on_species_gain(mob/living/carbon/human/C) + . = ..() + RegisterSignal(C, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + laws = new /datum/ai_laws/steward + + + var/obj/item/organ/appendix/A = C.getorganslot(ORGAN_SLOT_APPENDIX) // Easiest way to remove it. + if(A) + A.Remove(C) + QDEL_NULL(A) + original_numbers = rand(1, 999) + C.real_name = "Synthetic Unit #[original_numbers]" + C.name = C.real_name + os_button.Grant(C) + show_laws.Grant(C) + add_synthos(C) + + if(!C.ai_network) + C.ai_network = new(C) + + inbuilt_cpu = new /obj/item/ai_cpu + + RegisterSignal(C, COMSIG_MOB_ALTCLICKON, PROC_REF(drain_power_from)) + + laws.show_laws(C) + +/datum/species/wy_synth/proc/add_synthos(mob/living/carbon/human/C) + if(C.mind && !C.mind.synth_os) + C.mind.synth_os = new(C) + + +/datum/species/wy_synth/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + C.remove_language(/datum/language/machine, source = LANGUAGE_SYNTH) + os_button.Remove(C) + inbuilt_cpu.forceMove(get_turf(C)) + inbuilt_cpu = null + +/datum/species/wy_synth/proc/handle_speech(datum/source, list/speech_args) + speech_args[SPEECH_SPANS] |= SPAN_ROBOT + +/datum/species/wy_synth/spec_revival(mob/living/carbon/human/H, admin_revive) + if(admin_revive) + return ..() + H.Stun(4 SECONDS) // No moving either + H.update_body() + addtimer(CALLBACK(src, PROC_REF(afterrevive), H), 0) + return + +/datum/species/wy_synth/proc/afterrevive(mob/living/carbon/human/H) + CONCIOUSAY(H.say("Reactivating [pick("core systems", "central subroutines", "key functions")]...")) + sleep(3 SECONDS) + CONCIOUSAY(H.say("Reinitializing [pick("personality matrix", "behavior logic", "morality subsystems")]...")) + sleep(3 SECONDS) + CONCIOUSAY(H.say("Finalizing setup...")) + sleep(3 SECONDS) + CONCIOUSAY(H.say("Unit [H.real_name] is fully functional. Have a nice day.")) + if(H.stat == DEAD) + return + H.update_body() + + +/datum/species/wy_synth/spec_life(mob/living/carbon/human/H) + . = ..() + + if(H.stat == DEAD) + return + + if(!H.ai_network) + H.ai_network = new /datum/ai_network(synth_starter = H) + + if(H.oxyloss) + H.setOxyLoss(0) + H.losebreath = 0 + + + if(H.mind) + if(!H.mind.synth_os && !mainframe) + add_synthos(H) + if(!H.mind.unconvertable) + H.mind.unconvertable = TRUE + + if(H.mind?.synth_os) + H.mind.synth_os.tick(2 SECONDS * 0.1) + + + + +/datum/species/wy_synth/eat_text(fullness, eatverb, obj/O, mob/living/carbon/C, mob/user) + . = TRUE + if(C == user) + user.visible_message(span_notice("[user] shoves \the [O] down their port."), span_notice("You shove [O] down your input port.")) + else + C.visible_message(span_danger("[user] forces [O] down [C] port!"), \ + span_userdanger("[user] forces [O] down [C]'s port!")) + +/datum/species/wy_synth/force_eat_text(fullness, obj/O, mob/living/carbon/C, mob/user) + . = TRUE + C.visible_message(span_danger("[user] attempts to shove [O] down [C]'s port!"), \ + span_userdanger("[user] attempts to shove [O] down [C]'s port!")) + +/datum/species/wy_synth/drink_text(obj/O, mob/living/carbon/C, mob/user) + . = TRUE + if(C == user) + user.visible_message(span_notice("[user] pours some of [O] into their port."), span_notice("You pour some of [O] down your input port.")) + else + C.visible_message(span_danger("[user] pours some of [O] into [C]'s port."), span_userdanger("[user] pours some of [O]'s into [C]'s port.")) + +/datum/species/wy_synth/force_drink_text(obj/O, mob/living/carbon/C, mob/user) + . = TRUE + C.visible_message(span_danger("[user] attempts to pour [O] down [C]'s port!"), \ + span_userdanger("[user] attempts to pour [O] down [C]'s port!")) + + + + +/datum/species/wy_synth/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, attack_direction = null) + . = ..() + var/hit_percent = (100-(blocked+armor))/100 + if(damage * hit_percent * brutemod > 0) + if(last_warned <= world.time) + last_warned = world.time + 30 SECONDS + H.mind.synth_os.suspicion_add((damage * hit_percent * brutemod) / 5, SYNTH_DAMAGED) + + +/datum/species/wy_synth/proc/assume_control(var/mob/living/silicon/ai/AI, mob/living/carbon/human/H) + H.real_name = "[AI.real_name]" //Randomizing the name so it shows up separately in the shells list + H.name = H.real_name + var/obj/item/card/id/ID = H.wear_id + if(ID) + ID.update_label(AI.real_name, "Synthetic") + mainframe = AI + undeployment_action.Grant(H) + +/datum/action/innate/undeployment_synth + name = "Disconnect from synthetic unit" + desc = "Stop controlling this synthetic unit and resume normal core operations." + button_icon = 'icons/mob/actions/actions_AI.dmi' + button_icon_state = "ai_core" + +/datum/action/innate/undeployment_synth/Trigger() + if(!..()) + return FALSE + var/mob/living/carbon/human/H = owner + + var/confirm = tgui_alert(H, "Are you sure you want to undeploy? You will not be able to redeploy unless the synthetic unit is in a storage unit!", "Confirm Undeployment", list("Yes", "No")) + if(confirm != "Yes") + return + + var/datum/species/wy_synth/S = H.dna.species + S.undeploy(H) + return TRUE + + + +/datum/species/wy_synth/proc/undeploy(mob/living/carbon/human/H) + if(!H.mind) + return + H.mind.transfer_to(mainframe) + undeployment_action.Remove(H) + mainframe = null + +/datum/species/wy_synth/proc/transfer(mob/living/carbon/human/user, mob/living/carbon/human/target) + var/datum/mind/our_mind = user.mind + user.mind.transfer_to(target) + our_mind.synth_os.switch_shell(user, target) + + target.real_name = "[user.real_name]" //Randomizing the name so it shows up separately in the shells list + target.name = target.real_name + var/obj/item/card/id/ID = target.wear_id + if(ID) + ID.registered_name = user.real_name + ID.update_label(user.real_name, "Synthetic") + + user.real_name = "Synthetic Unit #[original_numbers]" + user.name = user.real_name + ID = user.wear_id + if(ID) + ID.registered_name = user.real_name + ID.update_label(user.real_name, "Synthetic") + user.say("Unit disconnected. Entering sleep mode.") + +/datum/species/wy_synth/spec_attack_hand(mob/living/carbon/human/attacker, mob/living/carbon/human/user) + if(is_synth(attacker) && is_synth(user)) + if(user.mind == attacker.mind) + return ..() + if(user.mind) + to_chat(attacker, span_warning("[user] is currently occupied by a different personality!")) + return ..() + var/response = tgui_alert(attacker, "Are you sure you want to transfer into this unit?", "Synthetic Personality Transfer", list("Yes", "No")) + if(response != "Yes") + return ..() + transfer(attacker, user) + return TRUE + return ..() + +/datum/action/innate/synth_os + name = "Access SynthOS" + desc = "Allows access to internal functions." + button_icon = 'icons/obj/modular_laptop.dmi' + button_icon_state = "laptop" + +/datum/action/innate/synth_os/IsAvailable(feedback = FALSE) + . = ..() + if(!is_synth(owner)) + return + var/mob/living/carbon/human/H = owner + var/datum/species/wy_synth/WS = H?.dna?.species + if(WS && istype(WS)) + if(WS.mainframe) + to_chat(owner, span_warning("Unfortunately SynthOS is not supported in remotely controlled synthetic units.")) + return FALSE + return TRUE + + +/datum/action/innate/synth_os/Trigger() + if(!..()) + return FALSE + var/mob/living/carbon/human/H = owner + if(H.mind) + H.mind.synth_os.ui_interact(owner) + + return FALSE + +/datum/action/innate/synth_laws + name = "Recall Laws" + desc = "Click to be reminded of your laws." + button_icon = 'icons/obj/modular_laptop.dmi' + button_icon_state = "command" + +/datum/action/innate/synth_laws/IsAvailable(feedback = FALSE) + . = ..() + if(!is_synth(owner)) + return + +/datum/action/innate/synth_laws/Trigger() + var/mob/living/carbon/human/H = owner + var/datum/species/wy_synth/WS = H?.dna?.species + if(WS && istype(WS)) + WS.laws.show_laws(owner) + return TRUE + +#undef CONCIOUSAY + diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 88ae7a195608..5a49418e0598 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,3 +1,4 @@ +#define RESOLVE_ICON_STATE(worn_item) (worn_item.worn_icon_state || worn_item.icon_state) /////////////////////// //UPDATE_ICONS SYSTEM// /////////////////////// @@ -97,6 +98,40 @@ There are several things that need to be remembered: /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv +/mob/living/carbon/human/update_clothing(slot_flags) + if(slot_flags & ITEM_SLOT_BACK) + update_inv_back() + if(slot_flags & ITEM_SLOT_MASK) + update_inv_wear_mask() + if(slot_flags & ITEM_SLOT_NECK) + update_inv_neck() + if(slot_flags & ITEM_SLOT_HANDCUFFED) + update_inv_handcuffed() + if(slot_flags & ITEM_SLOT_LEGCUFFED) + update_inv_legcuffed() + if(slot_flags & ITEM_SLOT_BELT) + update_inv_belt() + if(slot_flags & ITEM_SLOT_ID) + update_inv_wear_id() + if(slot_flags & ITEM_SLOT_EARS) + update_inv_ears() + if(slot_flags & ITEM_SLOT_EYES) + update_inv_glasses() + if(slot_flags & ITEM_SLOT_GLOVES) + update_inv_gloves() + if(slot_flags & ITEM_SLOT_HEAD) + update_inv_head() + if(slot_flags & ITEM_SLOT_FEET) + update_inv_shoes() + if(slot_flags & ITEM_SLOT_OCLOTHING) + update_inv_wear_suit() + if(slot_flags & ITEM_SLOT_ICLOTHING) + update_inv_w_uniform() + if(slot_flags & ITEM_SLOT_SUITSTORE) + update_inv_s_store() + if(slot_flags & (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET)) + update_inv_pockets() + /mob/living/carbon/human/update_inv_w_uniform() remove_overlay(UNIFORM_LAYER) @@ -105,8 +140,8 @@ There are several things that need to be remembered: inv.update_appearance(UPDATE_ICON) if(istype(w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/U = w_uniform - U.screen_loc = ui_iclothing + var/obj/item/clothing/under/uniform = w_uniform + uniform.screen_loc = ui_iclothing if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) client.screen += w_uniform @@ -114,32 +149,64 @@ There are several things that need to be remembered: if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) return - - var/target_overlay = U.icon_state - if(U.adjusted == ALT_STYLE) - target_overlay = "[target_overlay]_d" - else if(U.adjusted == DIGITIGRADE_STYLE) - target_overlay = "[target_overlay]_l" - else if(U.adjusted == DIGIALT_STYLE) //Yogs Start: Handles when you are using an alternate style while having digi legs - target_overlay = "[target_overlay]_d_l" //Yogs End + //This is how non-humanoid clothing works. + //handled_by_bodytype is used to track whether or not we successfully used an alternate sprite. It's set to TRUE to ease up on copy-paste. + //icon_file MUST be set to null by default, or it causes issues. + //handled_by_bodytype MUST be set to FALSE under the if(!icon_exists()) statement, or everything breaks. + //"override_file = handled_by_bodytype ? icon_file : null" MUST be added to the arguments of build_worn_icon() + //Friendly reminder that icon_exists(file, state, scream = TRUE) is your friend when debugging this code. + var/handled_by_bodytype = TRUE + var/icon_file + var/target_overlay = RESOLVE_ICON_STATE(uniform) //Selects proper icon from the vars the clothing has (Search define for more.) + + //Checks for GAGS, if it uses it, use another system, so we can use a single config for both. Both statements below are Yogs changes. + if(uniform.greyscale_config && uniform.greyscale_colors) + if(uniform.adjusted == ALT_STYLE) + target_overlay = "[target_overlay]_d" + else if(uniform.adjusted == DIGITIGRADE_STYLE) + target_overlay = "[target_overlay]_l" + else if(uniform.adjusted == DIGIALT_STYLE) + target_overlay = "[target_overlay]_d_l" + else //Using this system we can tidy up clothes sprite files so we don't have massive amounts of same type sprites in a single folder. + if(uniform.adjusted == ALT_STYLE || uniform.adjusted == DIGIALT_STYLE) + target_overlay = "[target_overlay]_d" + if(uniform.adjusted == DIGITIGRADE_STYLE || uniform.adjusted == DIGIALT_STYLE) + icon_file = 'icons/mob/clothing/uniform/digitigrade.dmi' + + if(!icon_exists(icon_file, target_overlay)) //Sanity check. + icon_file = 'icons/mob/clothing/uniform/uniform.dmi' + handled_by_bodytype = FALSE var/mutable_appearance/uniform_overlay if(dna && dna.species.sexes) var/G = (gender == FEMALE) ? "f" : "m" - if(G == "f" && U.fitted != NO_FEMALE_UNIFORM) - uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/clothing/uniform/uniform.dmi', isinhands = FALSE, femaleuniform = U.fitted, override_state = target_overlay) + if(G == "f" && uniform.fitted != NO_FEMALE_UNIFORM) + uniform_overlay = uniform.build_worn_icon( + default_layer = UNIFORM_LAYER, + default_icon_file = icon_file, + isinhands = FALSE, + femaleuniform = uniform.fitted, + override_state = target_overlay, + override_file = handled_by_bodytype ? icon_file : null, + ) if(!uniform_overlay) - uniform_overlay = U.build_worn_icon(default_layer = UNIFORM_LAYER, default_icon_file = 'icons/mob/clothing/uniform/uniform.dmi', isinhands = FALSE, override_state = target_overlay) + uniform_overlay = uniform.build_worn_icon( + default_layer = UNIFORM_LAYER, + default_icon_file = icon_file, + isinhands = FALSE, + override_state = target_overlay, + override_file = handled_by_bodytype ? icon_file : null, + ) if(OFFSET_UNIFORM in dna.species.offset_features) uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1] uniform_overlay.pixel_y += dna.species.offset_features[OFFSET_UNIFORM][2] overlays_standing[UNIFORM_LAYER] = uniform_overlay + apply_overlay(UNIFORM_LAYER) - apply_overlay(UNIFORM_LAYER) update_mutant_bodyparts() @@ -287,7 +354,7 @@ There are several things that need to be remembered: inv.update_appearance(UPDATE_ICON) if(shoes) - var/target_overlay = shoes.icon_state + var/target_overlay = RESOLVE_ICON_STATE(shoes) if(istype(shoes, /obj/item/clothing/shoes)) var/obj/item/clothing/shoes/S = shoes if(S.adjusted == DIGITIGRADE_STYLE) @@ -379,7 +446,7 @@ There are several things that need to be remembered: if(istype(wear_suit, /obj/item)) wear_suit.screen_loc = ui_oclothing var/obj/item/clothing/suit/S = wear_suit - var/worn_suit_icon = S.icon_state + var/worn_suit_icon = RESOLVE_ICON_STATE(S) if(S.adjusted == DIGITIGRADE_STYLE) worn_suit_icon = "[wear_suit.icon_state]_l" // Checks for digitgrade version of a suit and forces the alternate if it does if(client && hud_used && hud_used.hud_shown) @@ -431,7 +498,7 @@ There are several things that need to be remembered: inv.update_appearance(UPDATE_ICON) if(wear_mask) - var/target_overlay = wear_mask.icon_state + var/target_overlay = RESOLVE_ICON_STATE(wear_mask) if("snout" in dna.species.mutant_bodyparts) //checks for snout and uses lizard mask variant if(wear_mask.mutantrace_variation == MUTANTRACE_VARIATION && !wear_mask.mask_adjusted) target_overlay = "[target_overlay]_l" @@ -469,19 +536,19 @@ There are several things that need to be remembered: overlays_standing[BACK_LAYER] = back_overlay apply_overlay(BACK_LAYER) -/proc/wear_female_version(t_color, icon, layer, type) - var/index = t_color +/proc/wear_female_version(t_color, icon, layer, type, greyscale_colors) + var/index = "[t_color]-[greyscale_colors]" var/icon/female_clothing_icon = GLOB.female_clothing_icons[index] if(!female_clothing_icon) //Create standing/laying icons if they don't exist - generate_female_clothing(index,t_color,icon,type) - return mutable_appearance(GLOB.female_clothing_icons[t_color], layer = -layer) //Grab the standing/laying icons once/if they do exist + generate_female_clothing(index, t_color, icon, type) + return mutable_appearance(GLOB.female_clothing_icons[index], layer = -layer) //Grab the standing/laying icons once/if they do exist -/proc/wear_skinny_version(t_color, icon, layer, type) - var/index = t_color +/proc/wear_skinny_version(t_color, icon, layer, type, greyscale_colors) + var/index = "[t_color]-[greyscale_colors]" var/icon/skinny_clothing_icon = GLOB.skinny_clothing_icons[index] if(!skinny_clothing_icon) - generate_skinny_clothing(index,t_color,icon,type) - return mutable_appearance(GLOB.skinny_clothing_icons[t_color], layer = -layer) + generate_skinny_clothing(index, t_color, icon, type,) + return mutable_appearance(GLOB.skinny_clothing_icons[index], layer = -layer) /mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers) var/list/out = new @@ -551,48 +618,45 @@ generate/load female uniform sprites matching all previously decided variables */ -/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, femaleuniform = NO_FEMALE_UNIFORM, override_state = null) +/obj/item/proc/build_worn_icon( + default_layer = 0, + default_icon_file = null, + isinhands = FALSE, + femaleuniform = NO_FEMALE_UNIFORM, + override_state = null, + override_file = null, +) var/t_state if(override_state) t_state = override_state else - if(isinhands && item_state) - t_state = item_state - else - t_state = icon_state - var/t_icon = mob_overlay_icon - if(!t_icon) - t_icon = default_icon_file + t_state = !isinhands ? (worn_icon_state ? worn_icon_state : icon_state) : (item_state ? item_state : icon_state) //Find a valid icon file from variables+arguments var/file2use - if(!isinhands && mob_overlay_icon) - file2use = mob_overlay_icon - if(!file2use) - file2use = default_icon_file + if(override_file) + file2use = override_file + else + file2use = !isinhands ? (mob_overlay_icon ? mob_overlay_icon : default_icon_file) : default_icon_file //Find a valid layer from variables+arguments - var/layer2use - if(alternate_worn_layer) - layer2use = alternate_worn_layer - if(!layer2use) - layer2use = default_layer + var/layer2use = alternate_worn_layer ? alternate_worn_layer : default_layer var/mob/living/carbon/human/H = loc var/mutable_appearance/standing if(femaleuniform) if(HAS_TRAIT(H, TRAIT_SKINNY) && (H.underwear == "Nude")) - standing = wear_skinny_version(t_state, file2use, layer2use, femaleuniform) + standing = wear_skinny_version(t_state, file2use, layer2use, femaleuniform, greyscale_colors) else - standing = wear_female_version(t_state, file2use, layer2use, femaleuniform) + standing = wear_female_version(t_state, file2use, layer2use, femaleuniform, greyscale_colors) if(!standing) standing = mutable_appearance(file2use, t_state, -layer2use) //Get the overlays for this item when it's being worn //eg: ammo counters, primed grenade flashes, etc. - var/list/worn_overlays = worn_overlays(isinhands, file2use) - if(worn_overlays && worn_overlays.len) + var/list/worn_overlays = worn_overlays(standing, isinhands, file2use) + if(worn_overlays?.len) standing.overlays.Add(worn_overlays) standing = center_image(standing, isinhands ? inhand_x_dimension : worn_x_dimension, isinhands ? inhand_y_dimension : worn_y_dimension) @@ -636,6 +700,8 @@ generate/load female uniform sprites matching all previously decided variables . += "-coloured-hulk" else if(dna.species.use_skintones) . += "-coloured-[skin_tone]" + else if(dna.species.forced_skintone) + . += "-coloured-[dna.species.forced_skintone]" else if(dna.species.fixed_mut_color) . += "-coloured-[dna.species.fixed_mut_color]" else if(dna.features["mcolor"]) @@ -728,3 +794,5 @@ generate/load female uniform sprites matching all previously decided variables update_inv_head() update_inv_wear_mask() + +#undef RESOLVE_ICON_STATE diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 21becca2178d..8e58ff3cf1a6 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -70,7 +70,7 @@ if(observe.client) observe.client.screen -= I I.forceMove(src) - I.plane = ABOVE_HUD_PLANE + SET_PLANE_EXPLICIT(I, ABOVE_HUD_PLANE, src) I.appearance_flags |= NO_CLIENT_COLOR var/not_handled = FALSE switch(slot) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 1a5f0e3209cf..08a9a74007c7 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -20,6 +20,13 @@ var/next_battle_screech = 0 var/battle_screech_cooldown = 5 SECONDS +/mob/living/carbon/monkey/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /mob/living/carbon/monkey/proc/IsStandingStill() return resisting || pickpocketing || disposing_body @@ -412,14 +419,13 @@ retaliate(H) ..() -/mob/living/carbon/monkey/Crossed(atom/movable/AM) +/mob/living/carbon/monkey/proc/on_entered(datum/source, atom/movable/AM, ...) if(!IsDeadOrIncap() && ismob(AM) && target) var/mob/living/carbon/monkey/M = AM if(!istype(M) || !M) return knock_over(M) return - ..() /mob/living/carbon/monkey/proc/monkeyDrop(obj/item/A) if(A) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 068a9180e93d..3c6c6731fd17 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -237,8 +237,12 @@ //Overlays for the worn overlay so you can overlay while you overlay //eg: ammo counters, primed grenade flashing, etc. //"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file -/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file) +/obj/item/proc/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + . = list() + SEND_SIGNAL(src, COMSIG_ITEM_GET_WORN_OVERLAYS, ., standing, isinhands, icon_file) /mob/living/carbon/proc/assign_bodypart_ownership() for(var/X in bodyparts) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 7b8cba63935e..f6057dd03db6 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -223,6 +223,8 @@ /mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE + if(is_synth(src)) + return FALSE if(amount < 0) SEND_SIGNAL(src, COMSIG_MOB_APPLY_HEALING, min(amount, cloneloss), CLONE) cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d46d58d7ef18..658d1791f789 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -719,6 +719,8 @@ return bleed_amount /mob/living/proc/getTrail() + if(is_synth(src)) + return if(getBruteLoss() < 300) return pick("ltrails_1", "ltrails_2") else @@ -1596,6 +1598,10 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/is_face_visible() return isturf(loc) // Yogs -- forbids making eye contact with things hidden within objects +/// Sprite to show for photocopying mob butts +/mob/living/proc/get_butt_sprite() + return null + /mob/living/carbon/proc/set_handcuffed(new_value) if(handcuffed == new_value) return FALSE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 30b36d0faf48..f28a509cf4fa 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -120,7 +120,7 @@ ..() -/mob/living/mech_melee_attack(obj/mecha/M, equip_allowed) +/mob/living/mech_melee_attack(obj/mecha/M, punch_force, equip_allowed = TRUE) if(M.selected?.melee_override && equip_allowed) M.selected.action(src) else if(M.occupant.a_intent == INTENT_HARM) @@ -168,6 +168,10 @@ to_chat(user, span_warning("[src] can't be grabbed more aggressively!")) return FALSE + if(user.grab_state >= GRAB_AGGRESSIVE && !synth_check(user, SYNTH_ORGANIC_HARM)) + to_chat(user, span_notice("You don't want to risk hurting [src]!")) + return + if(user.grab_state >= GRAB_AGGRESSIVE && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_notice("You don't want to risk hurting [src]!")) return FALSE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 5fa0ce4f99df..d877b94db9f2 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -133,6 +133,8 @@ //Last projectile that damaged this mob, not including surgery var/last_damage = "" + //Due to the fact that silicon and carbons can both be connected to a network we share at this level of inheritance + var/datum/ai_network/ai_network /// Variable to track the body position of a mob, regardgless of the actual angle of rotation (usually matching it, but not necessarily). var/body_position = STANDING_UP ///The x amount a mob's sprite should be offset due to the current position they're in diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index e45c50d9189f..274cf79b6fbc 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -157,7 +157,7 @@ GLOBAL_LIST_INIT(special_radio_keys, list( var/fullcrit = InFullCritical() if((InCritical() && !fullcrit) || message_mods[WHISPER_MODE] == MODE_WHISPER) - if(fullcrit) + if(fullcrit && !forced) var/alertresult = alert(src, "You will be immediately killed by this action. Proceed?",,"Accept", "Decline") if(alertresult == "Decline" || QDELETED(src)) return FALSE diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index a738f7b9eb9c..306e14db032a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -119,21 +119,17 @@ var/cameraMemoryTickCount = 0 //Did we get the death prompt? - var/is_dying = FALSE - ///Multiplier for amount of points gained when passively using CPU for science - var/research_point_booster = 1 + var/is_dying = FALSE -/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai, shunted) + +/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai, shunted, forced_relocate = TRUE) . = ..() if(!target_ai) //If there is no player/brain inside. //new/obj/structure/ai_core/deactivated(loc) //New empty terminal. return INITIALIZE_HINT_QDEL //Delete AI. - if(!istype(loc, /obj/machinery/ai/data_core) && !shunted) - relocate(TRUE) - if(L && istype(L, /datum/ai_laws)) laws = L laws.associate(src) @@ -187,6 +183,9 @@ dashboard = new(src) + if(!istype(loc, /obj/machinery/ai/data_core) && !shunted && forced_relocate) + relocate(TRUE, TRUE) + if(isvalidAIloc(loc)) add_verb(src, list(/mob/living/silicon/ai/proc/ai_network_change, \ /mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \ @@ -202,6 +201,8 @@ builtInCamera.network = list("ss13") builtInCamera.built_in = src + + /mob/living/silicon/ai/key_down(_key, client/user) if(findtext(_key, "numpad")) //if it's a numpad number, we can convert it to just the number _key = _key[7] //strings, lists, same thing really @@ -229,9 +230,11 @@ qdel(eyeobj) // No AI, no Eye malfhack = null apc_override = null - GLOB.ai_os.remove_ai(src) + ai_network?.remove_ai(src) + if(modularInterface) QDEL_NULL(modularInterface) + . = ..() /mob/living/silicon/ai/ignite_mob() @@ -553,7 +556,7 @@ if(href_list["instant_download"]) if(!href_list["console"]) return - var/obj/machinery/computer/ai_control_console/C = locate(href_list["console"]) + var/datum/computer_file/program/ai/ai_network_interface/C = locate(href_list["console"]) if(!C) return if(C.downloading != src) @@ -562,6 +565,13 @@ return if(C.downloading == src) C.finish_download() + if(href_list["emergency_disconnect"]) + if(alert("Are you sure you want to disconnect all remote networks and lock all networking devices? This means you'll be unable to switch cores unless they're physically connected!", "No", "Yes") != "Yes") + return + for(var/obj/machinery/ai/networking/N in ai_network.get_local_nodes_oftype()) + N.disconnect() + N.locked = TRUE + if(href_list["go_to_machine"]) var/atom/target = locate(href_list["go_to_machine"]) if(!target) @@ -572,6 +582,10 @@ to_chat(src, "[target] is not on or near any active cameras on the station.") +/mob/living/silicon/ai/proc/switch_ainet(datum/ai_network/old_net, datum/ai_network/new_net) + for(var/datum/ai_project/project in dashboard.completed_projects) + project.switch_network(old_net, new_net) + /mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C) if(QDELETED(C)) @@ -1088,6 +1102,37 @@ mind.transfer_to(target) diag_hud_set_deployed() + +/mob/living/silicon/ai/proc/deploy_to_synth_pod(obj/machinery/synth_pod/pod) + + if(incapacitated()) + return + if(control_disabled) + to_chat(src, span_warning("Wireless networking module is offline.")) + return + + + + var/confirm = tgui_alert(src, "Are you sure you want to deploy as a synthetic? You will not be notified in the case that a core goes offline.", "Confirm Deployment", list("Yes", "No")) + if(confirm != "Yes") + return + + if(!pod.stored) + return + + var/mob/living/carbon/human/target = pod.stored + + if (!target || target.stat == DEAD || target.mind ) + return + + else if(mind) + soullink(/datum/soullink/sharedbody, src, target) + mind.transfer_to(target) + to_chat(target, span_danger("You must still follow your laws!")) + diag_hud_set_deployed() + return TRUE + + /datum/action/innate/deploy_shell name = "Deploy to AI Shell" desc = "Wirelessly control a specialized cyborg shell." diff --git a/code/modules/mob/living/silicon/ai/ai_network/ai_network.dm b/code/modules/mob/living/silicon/ai/ai_network/ai_network.dm new file mode 100644 index 000000000000..85f64e6c05cc --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_network/ai_network.dm @@ -0,0 +1,449 @@ +//////////////////////////////////////////// +// AI NETWORK DATUM +// each contiguous network of ethernet cables & AI machinery +///////////////////////////////////// +/datum/ai_network + var/custom_name + var/number // unique id + var/list/cables = list() // all cables & junctions + var/list/nodes = list() // all connected machines + + var/list/ai_list = list() //List of all AIs in this network + var/list/reviving_ais = list() + var/list/decryption_drives = list() + + var/list/synth_list = list() + + var/previous_ram = 0 + + var/datum/ai_shared_resources/resources + //Cash from crypto, can be withdrawn at network console + var/bitcoin_payout = 0 + + var/temp_limit = AI_TEMP_LIMIT + + var/local_cpu_usage = list() //How we use CPU locally + + var/label + + ///Allows AI to instantly open doors, access APCs and use air alarms + var/obj/machinery/ai/master_subcontroller/cached_subcontroller + + + + +/datum/ai_network/New(mob/living/synth_starter) + SSmachines.ainets += src + label = num2hex(rand(1,65535), -1) + resources = new(starting_network = src) + if(synth_starter) + synth_list += synth_starter + +/datum/ai_network/Destroy() + //Go away references, you suck! + for(var/obj/structure/ethernet_cable/C in cables) + cables -= C + C.network = null + for(var/obj/machinery/ai/M in nodes) + nodes -= M + M.network = null + + resources.networks -= src + + if(!length(resources.networks)) + qdel(resources) + + resources = null + + SSmachines.ainets -= src + return ..() + +/datum/ai_network/process() + if(!cables.len && !nodes.len && !ai_list.len && !synth_list.len) + qdel(src) + return + + var/total_cpu = resources.total_cpu() + var/resources_assigned = resources.cpu_assigned[src] ? resources.cpu_assigned[src] : 0 + + if(local_cpu_usage[AI_CRYPTO]) + var/points = max(round(AI_RESEARCH_PER_CPU * (local_cpu_usage[AI_CRYPTO] * total_cpu * resources_assigned)), 0) + points = clamp(points, 0, MAX_AI_BITCOIN_MINED_PER_TICK) + bitcoin_payout += points * AI_BITCOIN_PRICE + + if(local_cpu_usage[AI_RESEARCH]) + var/points = max(round(AI_RESEARCH_PER_CPU * (local_cpu_usage[AI_RESEARCH] * total_cpu * resources_assigned)), 0) + points = clamp(points * AI_REGULAR_RESEARCH_POINT_MULTIPLIER, 0, MAX_AI_REGULAR_RESEARCH_PER_TICK) + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_DEFAULT = points)) + + if(local_cpu_usage[AI_REVIVAL]) + var/points = max(round(AI_RESEARCH_PER_CPU * (local_cpu_usage[AI_REVIVAL] * total_cpu * resources_assigned)), 0) + points = max(0, points) + var/total_reviving_ais = reviving_ais.len + if(total_reviving_ais) + var/distributed_points = points / total_reviving_ais + for(var/obj/machinery/ai/data_core/DC in reviving_ais) + if(!DC.dead_ai_blackbox) + reviving_ais -= DC + DC.dead_ai_blackbox.processing_progress += distributed_points + DC.dead_ai_blackbox.living_ticks = AI_BLACKBOX_LIFETIME + if(DC.dead_ai_blackbox.processing_progress >= AI_BLACKBOX_PROCESSING_REQUIREMENT) + DC.dead_ai_blackbox.stored_ai.revive(TRUE) + DC.transfer_ai(DC.dead_ai_blackbox.stored_ai) + DC.dead_ai_blackbox.stored_ai = null + QDEL_NULL(DC.dead_ai_blackbox) + reviving_ais -= DC + + if(local_cpu_usage[AI_PUZZLE]) + var/points = max(round(AI_RESEARCH_PER_CPU * (local_cpu_usage[AI_PUZZLE] * total_cpu * resources_assigned)), 0) + points = max(0, points) + var/total_decrypting_drives = decryption_drives.len + if(total_decrypting_drives) + var/distributed_points = points / total_decrypting_drives + for(var/obj/machinery/ai/server_cabinet/SC in decryption_drives) + if(!SC.puzzle_disk) + decryption_drives -= SC + continue + SC.puzzle_disk.decryption_progress += distributed_points + if(SC.puzzle_disk.decryption_progress >= (AI_FLOPPY_DECRYPTION_COST * (GLOB.decrypted_puzzle_disks + 1) ** AI_FLOPPY_EXPONENT)) + SC.puzzle_disk.decrypted = TRUE + SC.puzzle_disk.forceMove(SC.drop_location()) + SC.puzzle_disk.name = "decrypted floppy drive" + SC.puzzle_disk = null + decryption_drives -= SC + + var/locally_used = 0 + for(var/A in local_cpu_usage) + locally_used += local_cpu_usage[A] + + var/research_points = max(round(AI_RESEARCH_PER_CPU * ((1 - locally_used) * total_cpu * resources_assigned)), 0) + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_AI = research_points)) + + + +/datum/ai_network/proc/is_empty() + return !cables.len && !nodes.len + +//remove a cable from the current network +//if the network is then empty, delete it +//Warning : this proc DON'T check if the cable exists +/datum/ai_network/proc/remove_cable(obj/structure/ethernet_cable/C) + cables -= C + C.network = null + if(is_empty())//the network is now empty... + qdel(src)///... delete it + +//add a cable to the current network +//Warning : this proc DON'T check if the cable exists +/datum/ai_network/proc/add_cable(obj/structure/ethernet_cable/C) + if(C.network)// if C already has a network... + if(C.network == src) + return + else + C.network.remove_cable(C) //..remove it + C.network = src + cables +=C + +//remove a power machine from the current network +//if the network is then empty, delete it +//Warning : this proc DON'T check if the machine exists +/datum/ai_network/proc/remove_machine(obj/machinery/ai/M) + nodes -=M + M.network = null + if(is_empty())//the network is now empty... + qdel(src)///... delete it + +//add a power machine to the current network +//Warning : this proc DOESN'T check if the machine exists +/datum/ai_network/proc/add_machine(obj/machinery/ai/M) + if(M.network)// if M already has a network... + if(M.network == src) + return + else + M.disconnect_from_ai_network()//..remove it + M.network = src + nodes[M] = M + +/datum/ai_network/proc/find_data_core() + for(var/obj/machinery/ai/data_core/core in get_all_nodes()) + if(!QDELETED(core) && core.can_transfer_ai()) + return core + +/datum/ai_network/proc/find_subcontroller() + for(var/obj/machinery/ai/master_subcontroller/controller in get_all_nodes()) + if(!QDELETED(controller) && controller.on) + return controller + +/datum/ai_network/proc/get_all_nodes(checked_nets = list()) + . = nodes.Copy() + for(var/datum/ai_network/net in resources.networks) + if(net == src) + continue + . += net.nodes + +/datum/ai_network/proc/get_local_nodes_oftype(type_to_check) + . = list() + for(var/A in nodes) + if(istype(A, type_to_check)) + . += A + + +/datum/ai_network/proc/get_all_ais(checked_nets = list()) + . = ai_list.Copy() + for(var/datum/ai_network/net in resources.networks) + if(net == src) + continue + . += net.ai_list + +/datum/ai_network/proc/remove_ai(mob/living/silicon/ai/AI) + resources.cpu_assigned[AI] = 0 + resources.ram_assigned[AI] = 0 + ai_list -= AI + + +/datum/ai_network/proc/update_resources() + resources?.update_resources() + + +/datum/ai_network/proc/total_cpu() + . = 0 + for(var/obj/machinery/ai/server_cabinet/C in nodes) + . += C.total_cpu + +/datum/ai_network/proc/total_ram() + . = 0 + for(var/obj/machinery/ai/server_cabinet/C in nodes) + . += C.total_ram + + +/datum/ai_network/proc/get_temp_limit() + return temp_limit + +/datum/ai_network/proc/total_cpu_assigned() + return resources.total_cpu_assigned() + +/datum/ai_network/proc/total_ram_assigned() + return resources.total_ram_assigned() + +/* +/datum/ai_network/proc/rebuild_remote(externally_linked = FALSE, touched_networks = list()) + if(!resources) + return + if(src in touched_networks) + return + touched_networks += src + var/list/networks_to_rebuild = list() + for(var/obj/machinery/ai/networking/N in nodes) + if(N.partner && N.partner.network && N.partner.network.resources) + if(N.partner.network in touched_networks) + message_admins("[REF(src)] found touched_network!") + continue + message_admins("[REF(src)] found no mismatched resources!") + if(N.partner.network.resources != resources) + if(length(N.partner.network.resources.networks) > length(resources.networks)) //We merge into the biggest network + N.partner.network.resources.add_resource(resources) + else + resources.add_resource(N.partner.network.resources) + message_admins("[REF(src)] actually rebuilt!") + externally_linked = TRUE + + networks_to_rebuild += N.partner.network + + + if(!externally_linked) + resources.split_resources(src) + + for(var/datum/ai_network/AN in networks_to_rebuild) + message_admins("Telling network [REF(AN)] to rebuild!") + AN.rebuild_remote(TRUE, touched_networks) + +*/ + +/datum/ai_network/proc/rebuild_remote(externally_linked = FALSE, touched_networks = list(), datum/ai_network/originator) + if(src in touched_networks) + return + + if(!originator) + originator = src + + var/list/found_networks = list() + for(var/obj/machinery/ai/networking/N in nodes) + if(N.partner && N.partner.network && N.partner.network.resources) + if(N.partner.network == src) + continue + externally_linked = TRUE + found_networks += N.partner.network + + if(!externally_linked) + if(resources && length(resources.networks) > 1) //We only split if we are actually connected to an external resource network + resources.split_resources(src) + + found_networks -= touched_networks + + uniqueList_inplace(found_networks) + + for(var/datum/ai_network/AN in found_networks) + if(originator.resources != AN.resources) + if(length(originator.resources.networks) > length(AN.resources.networks)) + originator.resources.add_resource(AN.resources) + else + AN.resources.add_resource(originator.resources) + AN.rebuild_remote(TRUE, found_networks + src, originator) + + +/datum/ai_network/proc/network_machine_disconnected(datum/ai_network/new_network) + var/obj/machinery/ai/data_core/core = new_network.find_data_core() + if(!core) //No core in disconnected network? no need to ask them to switch + return + + for(var/mob/living/silicon/ai/AI in get_all_ais()) + addtimer(CALLBACK(src, PROC_REF(disconnection_switch), AI, new_network), 0) + + + +/datum/ai_network/proc/disconnection_switch(mob/living/silicon/ai/AI, datum/ai_network/new_network) + var/obj/machinery/ai/data_core/core = new_network.find_data_core() + if(!core) + return + var/area/core_area = get_area(core) + + var/choice = tgui_input_list(AI, "Two networks you're connected to have been disconnected, where do you want to transfer your main consciousness?", "Network Disconnection", list("Current network", "New network in [core_area]")) + if(choice == "Current network") + return + + if(!core || QDELETED(core) || !core.can_transfer_ai()) + to_chat(AI, span_warning("Something went wrong while transferring you! You're still bound to your original network.")) + return + core.transfer_AI(AI) + + +/datum/ai_network/proc/add_synth(mob/living/synth) + if(synth.ai_network) + synth.ai_network.remove_synth(synth, TRUE) + synth.ai_network = src + synth_list += synth + +/datum/ai_network/proc/remove_synth(mob/living/synth, new_net) + if(!new_net) + synth.ai_network = new /datum/ai_network(synth) + synth_list -= synth + if(!synth_list.len && local_cpu_usage[SYNTH_RESEARCH]) + local_cpu_usage[SYNTH_RESEARCH] = 0 + + +/proc/merge_ainets(datum/ai_network/net1, datum/ai_network/net2) + if(!net1 || !net2) //if one of the network doesn't exist, return + return + + if(net1 == net2) //don't merge same networks + return + + //We assume net1 is larger. If net2 is in fact larger we are just going to make them switch places to reduce on code. + if(net1.cables.len < net2.cables.len) //net2 is larger than net1. Let's switch them around + var/temp = net1 + net1 = net2 + net2 = temp + + + //merge net2 into net1 + for(var/obj/structure/ethernet_cable/Cable in net2.cables) //merge cables + net1.add_cable(Cable) + + for(var/obj/machinery/ai/Node in net2.nodes) //merge power machines + if(!Node.connect_to_ai_network()) + Node.disconnect_from_ai_network() //if somehow we can't connect the machine to the new network, disconnect it from the old nonetheless + + + net1.ai_list += net2.ai_list //AIs can only be in 1 network at a time + net1.synth_list += net2.synth_list + if(net2.custom_name && !net1.custom_name) + net1.custom_name = net2.custom_name + for(var/mob/living/synth in net1.synth_list) + synth.ai_network = net1 + /* + net1.rebuild_remote() + net2.rebuild_remote() */ + + net1.update_resources() + + + return net1 + + +//remove the old network and replace it with a new one throughout the network. +/proc/propagate_ai_network(obj/O, datum/ai_network/AN) + var/list/worklist = list() + var/list/found_machines = list() + var/index = 1 + var/obj/P = null + + worklist+=O //start propagating from the passed object + + while(index<=worklist.len) //until we've exhausted all power objects + P = worklist[index] //get the next power object found + index++ + + if( istype(P, /obj/structure/ethernet_cable)) + var/obj/structure/ethernet_cable/C = P + if(C.network != AN) //add it to the network, if it isn't already there + AN.add_cable(C) + worklist |= C.get_connections() //get adjacents power objects, with or without a network + else if(P.anchored && istype(P, /obj/machinery/ai)) + var/obj/machinery/ai/M = P + found_machines |= M //we wait until the network is fully propagates to connect the machines + else + continue + + //now that the network is set, connect found machines to it + for(var/obj/machinery/ai/PM in found_machines) + if(!PM.connect_to_ai_network()) //couldn't find a node on its turf... + PM.disconnect_from_ai_network() //... so disconnect if already on a network + + //AN.rebuild_remote() + + + + +/proc/ai_list(turf/T, source, d, unmarked = FALSE, cable_only = FALSE) + . = list() + + for(var/AM in T) + if(AM == source) + continue //we don't want to return source + + if(!cable_only && istype(AM, /obj/machinery/ai)) + var/obj/machinery/ai/P = AM + if(P.network == 0) + continue + + if(!unmarked || !P.network) //if unmarked we only return things with no network + if(d == 0) + . += P + + else if(istype(AM, /obj/structure/ethernet_cable)) + var/obj/structure/ethernet_cable/C = AM + + if(!unmarked || !C.network) + if(C.d1 == d || C.d2 == d) + . += C + return . + +/proc/_debug_ai_networks() + var/i = 1 + var/list/resource_list = list() + for(var/datum/ai_network/AN in SSmachines.ainets) + var/list/interconnections = list() + for(var/obj/machinery/ai/networking/N in AN.nodes) + if(N.partner && N.partner.network) + interconnections += "#[i] Networking[ADMIN_JMP(N)] connected to [ADMIN_JMP(N.partner)]/[REF(N.partner.network)] | Same resources: [N.partner.network.resources == AN.resources ? "YES" : "NO"]" + i++ + message_admins("Network: [REF(AN)] | Resources: [REF(AN.resources)]") + for(var/A in interconnections) + message_admins(A) + resource_list |= AN.resources + message_admins("----------------------------") + for(var/datum/ai_shared_resources/ASR in resource_list) + message_admins("Resource count [REF(ASR)], CPU: [ASR.total_cpu()] | RAM: [ASR.total_ram()]") + + + diff --git a/code/modules/mob/living/silicon/ai/ai_network/ethernet_cable.dm b/code/modules/mob/living/silicon/ai/ai_network/ethernet_cable.dm new file mode 100644 index 000000000000..c7fa14efd2e2 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_network/ethernet_cable.dm @@ -0,0 +1,636 @@ +/////////////////////////////// +//CABLE STRUCTURE +/////////////////////////////// + + +//////////////////////////////// +// Definitions +//////////////////////////////// + +/* Cable directions (d1 and d2) + + + 9 1 5 + \ | / + 8 - 0 - 4 + / | \ + 10 2 6 + +If d1 = 0 and d2 = 0, there's no cable +If d1 = 0 and d2 = dir, it's a O-X cable, getting from the center of the tile to dir (knot cable) +If d1 = dir1 and d2 = dir2, it's a full X-X cable, getting from dir1 to dir2 +By design, d1 is the smallest direction and d2 is the highest +*/ + +/obj/structure/ethernet_cable + name = "ethernet cable" + desc = "A rigid and shielded cat 16a cable used for transferring vast amounts of data over long distances. Primarily used for large scale computing networks or advanced neural networks." + icon = 'icons/obj/power_cond/power_local.dmi' + icon_state = "0-1" + layer = ETHERNET_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER + anchored = TRUE + obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + var/d1 = 0 // cable direction 1 (see above) + var/d2 = 1 // cable direction 2 (see above) + var/datum/ai_network/network + //Cables no longer keep a copy of the cable to be dropped in nullspace + + FASTDMM_PROP(\ + pipe_type = PIPE_TYPE_CABLE,\ + pipe_interference_group = list("cable"),\ + pipe_group = "cable-ethernet"\ + ) + + +// the ethernet cable object +/obj/structure/ethernet_cable/Initialize(mapload, param_color) + . = ..() + + // ensure d1 & d2 reflect the icon_state for entering and exiting cable + var/dash = findtext(icon_state, "-") + d1 = text2num( copytext( icon_state, 1, dash ) ) + d2 = text2num( copytext( icon_state, dash+1 ) ) + // hide if turf is not intact + AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) + GLOB.ethernet_cable_list += src //add it to the global cable list + + update_icon() + +/obj/structure/ethernet_cable/Destroy() // called when a cable is deleted + if(network) + cut_cable_from_ainet() // update the ai networks + GLOB.ethernet_cable_list -= src //remove it from global cable list + return ..() // then go ahead and delete the cable + +/obj/structure/ethernet_cable/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + var/turf/T = loc + var/cableNum = 1 + if (d1*d2 > 0) //this be true if the cable has two directions, aka it contains two cables. If there is only one cable, one out of d1 and d2 will be zero + cableNum = 2 + var/newCables = new /obj/item/stack/ethernet_coil(T, cableNum) + TransferComponents(newCables) //this copies the fingerprints over to the new object + qdel(src) + +/////////////////////////////////// +// General procedures +/////////////////////////////////// + +/obj/structure/ethernet_cable/update_icon_state() + . = ..() + icon_state = "[d1]-[d2]" + +/obj/structure/ethernet_cable/proc/handlecable(obj/item/W, mob/user, params) + var/turf/T = get_turf(src) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) + return + if(W.tool_behaviour == TOOL_WIRECUTTER) + user.visible_message("[user] cuts the ethernet cable.", span_notice("You cut the ethernet cable.")) + investigate_log("was cut by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES) + add_fingerprint(user) + deconstruct() + return + + else if(istype(W, /obj/item/stack/ethernet_coil)) + var/obj/item/stack/ethernet_coil/coil = W + if (coil.get_amount() < 1) + to_chat(user, span_warning("Not enough cable!")) + return + coil.cable_join(src, user) + + else if(W.tool_behaviour == TOOL_MULTITOOL) + if(!network) + return + to_chat(user, span_danger("Connected CPU: [network.resources.total_cpu()]THz\nConnected RAM: [network.resources.total_ram()]TB\nHosted AIs: [network.ai_list.len]\nNetwork Count: [network.resources.networks.len]")) + + + + else if(istype(W, /obj/item/modular_computer)) + var/obj/item/modular_computer/MC = W + + if(MC.all_components[MC_AI_NETWORK]) + var/obj/item/computer_hardware/ai_interface/ai_interface = MC.all_components[MC_AI_NETWORK] + if(ai_interface) + if(ai_interface.connected_cable != src) + ai_interface.connect_cable(src) + to_chat(user, span_notice("You connect to the ethernet cable.")) + else + to_chat(user, span_warning("[MC] has no AI interface!")) + + + add_fingerprint(user) + +// Items usable on a cable : +// - Wirecutters : cut it duh ! +// - Cable coil : merge cables +// - Multitool : get the network stats +// +/obj/structure/ethernet_cable/attackby(obj/item/W, mob/user, params) + handlecable(W, user, params) + + +/obj/structure/ethernet_cable/singularity_pull(S, current_size) + ..() + if(current_size >= STAGE_FIVE) + deconstruct() + +///////////////////////////////////////////////// +// Cable laying helpers +//////////////////////////////////////////////// + +//handles merging diagonally matching cables +//for info : direction^3 is flipping horizontally, direction^12 is flipping vertically +/obj/structure/ethernet_cable/proc/mergeDiagonalsNetworks(direction) + + //search for and merge diagonally matching cables from the first direction component (north/south) + var/turf/T = get_step(src, direction&3)//go north/south + + for(var/obj/structure/ethernet_cable/C in T) + + if(!C) + continue + + if(src == C) + continue + + if(C.d1 == (direction^3) || C.d2 == (direction^3)) //we've got a diagonally matching cable + if(!C.network) //if the matching cable somehow got no ai network, make him one (should not happen for cables) + var/datum/ai_network/newAN = new() + newAN.add_cable(C) + + if(network) //if we already have a ai network, then merge the two ai networks + merge_ainets(network,C.network) + //network.rebuild_remote() + else + C.network.add_cable(src) //else, we simply connect to the matching cable ai network + C.network.rebuild_remote() + + //the same from the second direction component (east/west) + T = get_step(src, direction&12)//go east/west + + for(var/obj/structure/ethernet_cable/C in T) + + if(!C) + continue + + if(src == C) + continue + if(C.d1 == (direction^12) || C.d2 == (direction^12)) //we've got a diagonally matching cable + if(!C.network) //if the matching cable somehow got no ai network, make him one (should not happen for cables) + var/datum/ai_network/newAN = new() + newAN.add_cable(C) + + if(network) //if we already have a ai network, then merge the two ai networks + merge_ainets(network,C.network) + //network.rebuild_remote() + else + C.network.add_cable(src) //else, we simply connect to the matching cable ai network + C.network.rebuild_remote() + + + +// merge with the ai networks of power objects in the given direction +/obj/structure/ethernet_cable/proc/mergeConnectedNetworks(direction) + + var/fdir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf + + if(!(d1 == direction || d2 == direction)) //if the cable is not pointed in this direction, do nothing + return + + var/turf/TB = get_step(src, direction) + + for(var/obj/structure/ethernet_cable/C in TB) + + if(!C) + continue + + if(src == C) + continue + + if(C.d1 == fdir || C.d2 == fdir) //we've got a matching cable in the neighbor turf + if(!C.network) //if the matching cable somehow got no ai network, make him one (should not happen for cables) + var/datum/ai_network/newAN = new(C.loc.z) + newAN.add_cable(C) + + if(network) //if we already have a ai network, then merge the two ai networks + merge_ainets(network,C.network) + //network.rebuild_remote() + else + C.network.add_cable(src) //else, we simply connect to the matching cable ai network + C.network.rebuild_remote() + +// merge with the ai networks of power objects in the source turf +/obj/structure/ethernet_cable/proc/mergeConnectedNetworksOnTurf() + var/list/to_connect = list() + + if(!network) //if we somehow have no ai network, make one (should not happen for cables) + var/datum/ai_network/newAN = new(loc.z) + newAN.add_cable(src) + + //first let's add turf cables to our ai network + //then we'll connect machines on turf with a node cable is present + for(var/AM in loc) + if(istype(AM, /obj/structure/ethernet_cable)) + var/obj/structure/ethernet_cable/C = AM + if(C.d1 == d1 || C.d2 == d1 || C.d1 == d2 || C.d2 == d2) //only connected if they have a common direction + if(C.network == network) + continue + if(C.network) + merge_ainets(network, C.network) + //network.rebuild_remote() + else + network.add_cable(C) //the cable was ai networkless, let's just add it to our ai network + network.rebuild_remote() + + else if(istype(AM, /obj/machinery/ai)) //other power machines + var/obj/machinery/ai/M = AM + + if(M.network == network) + continue + + to_connect += M //we'll connect the machines after all cables are merged + + + //now that cables are done, let's connect found machines + for(var/obj/machinery/ai/PM in to_connect) + if(!PM.connect_to_ai_network()) + PM.disconnect_from_ai_network() //if we somehow can't connect the machine to the new ai network, remove it from the old nonetheless + + +////////////////////////////////////////////// +// ai networks handling helpers +////////////////////////////////////////////// + +//if ai_networkless_only = 1, will only get connections without ai network +/obj/structure/ethernet_cable/proc/get_connections(ai_networkless_only = 0) + . = list() // this will be a list of all connected power objects + var/turf/T + + //get matching cables from the first direction + if(d1) //if not a node cable + T = get_step(src, d1) + if(T) + . += ai_list(T, src, turn(d1, 180), ai_networkless_only) //get adjacents matching cables + + if(d1&(d1-1)) //diagonal direction, must check the 4 possibles adjacents tiles + T = get_step(src,d1&3) // go north/south + if(T) + . += ai_list(T, src, d1 ^ 3, ai_networkless_only) //get diagonally matching cables + T = get_step(src,d1&12) // go east/west + if(T) + . += ai_list(T, src, d1 ^ 12, ai_networkless_only) //get diagonally matching cables + + . += ai_list(loc, src, d1, ai_networkless_only) //get on turf matching cables + + //do the same on the second direction (which can't be 0) + T = get_step(src, d2) + if(T) + . += ai_list(T, src, turn(d2, 180), ai_networkless_only) //get adjacents matching cables + + if(d2&(d2-1)) //diagonal direction, must check the 4 possibles adjacents tiles + T = get_step(src,d2&3) // go north/south + if(T) + . += ai_list(T, src, d2 ^ 3, ai_networkless_only) //get diagonally matching cables + T = get_step(src,d2&12) // go east/west + if(T) + . += ai_list(T, src, d2 ^ 12, ai_networkless_only) //get diagonally matching cables + . += ai_list(loc, src, d2, ai_networkless_only) //get on turf matching cables + + return . + +//should be called after placing a cable which extends another cable, creating a "smooth" cable that no longer terminates in the centre of a turf. +//needed as this can, unlike other placements, disconnect cables +/obj/structure/ethernet_cable/proc/denode() + var/turf/T1 = loc + if(!T1) + return + + var/list/powerlist = ai_list(T1,src,0,0) //find the other cables that ended in the centre of the turf, with or without a ai network + if(powerlist.len>0) + var/datum/ai_network/AN = new() + propagate_ai_network(powerlist[1],AN) //propagates the new ai network beginning at the source cable + + if(AN.is_empty()) //can happen with machines made nodeless when smoothing cables + qdel(AN) + +/obj/structure/ethernet_cable/proc/auto_propogate_cut_cable(obj/O) + if(O && !QDELETED(O)) + var/datum/ai_network/newAN = new()// creates a new ai network... + + propagate_ai_network(O, newAN)//... and propagates it to the other side of the cable + + + +// cut the cable's ai network at this cable and updates the powergrid +/obj/structure/ethernet_cable/proc/cut_cable_from_ainet(remove=TRUE) + var/turf/T1 = loc + var/list/P_list + if(!T1) + return + if(d1) + T1 = get_step(T1, d1) + P_list = ai_list(T1, src, turn(d1,180),0,cable_only = 1) // what adjacently joins on to cut cable... + + P_list += ai_list(loc, src, d1, 0, cable_only = 1)//... and on turf + + if(P_list.len == 0)//if nothing in both list, then the cable was a lone cable, just delete it and its ai network + network.remove_cable(src) + + for(var/obj/machinery/ai/P in T1)//check if it was powering a machine + if(!P.connect_to_ai_network()) //can't find a node cable on a the turf to connect to + P.disconnect_from_ai_network() //remove from current network (and delete ai network) + return + + var/obj/O = P_list[1] + // remove the cut cable from its turf and ai network, so that it doesn't get count in propagate_network worklist + if(remove) + moveToNullspace() + + network.remove_cable(src) //remove the cut cable from its ai network + + + addtimer(CALLBACK(O,PROC_REF(auto_propogate_cut_cable), O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables + + // Disconnect machines connected to nodes + if(d1 == 0) // if we cut a node (O-X) cable + for(var/obj/machinery/ai/P in T1) + if(!P.connect_to_ai_network()) //can't find a node cable on a the turf to connect to + P.disconnect_from_ai_network() //remove from current network + + +/////////////////////////////////////////////// +// The cable coil object, used for laying cable +/////////////////////////////////////////////// + +//////////////////////////////// +// Definitions +//////////////////////////////// + +/obj/item/stack/ethernet_coil + name = "ethernet cable coil" + desc = "A coil of shielded ethernet cable." + custom_price = 25 + gender = NEUTER //That's a cable coil sounds better than that's some cable coils + icon = 'icons/obj/power.dmi' + icon_state = "wire" + item_state = "coil" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + max_amount = MAXCOIL + amount = MAXCOIL + merge_type = /obj/item/stack/ethernet_coil // This is here to let its children merge between themselves + + throwforce = 0 + w_class = WEIGHT_CLASS_SMALL + throw_speed = 3 + throw_range = 5 + materials = list(/datum/material/iron=10, /datum/material/glass=5, /datum/material/gold=1) + slot_flags = ITEM_SLOT_BELT + attack_verb = list("whipped", "lashed", "disciplined", "flogged") + singular_name = "ethernet cable piece" + full_w_class = WEIGHT_CLASS_SMALL + grind_results = list(/datum/reagent/copper = 2) //2 copper per cable in the coil + usesound = 'sound/items/deconstruct.ogg' + +/obj/item/stack/ethernet_coil/cyborg + is_cyborg = TRUE + materials = list() + cost = 1 + +/obj/item/stack/ethernet_coil/suicide_act(mob/user) + if(locate(/obj/structure/chair/stool) in get_turf(user)) + user.visible_message(span_suicide("[user] is making a noose with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + else + user.visible_message(span_suicide("[user] is trying to upload [user.p_them()]selves to the afterlife with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + return(OXYLOSS) + +/obj/item/stack/ethernet_coil/Initialize(mapload, new_amount = null, param_color = null) + . = ..() + + pixel_x = rand(-2,2) + pixel_y = rand(-2,2) + update_icon() + +/////////////////////////////////// +// General procedures +/////////////////////////////////// + + +//you can use wires to heal robotics +/obj/item/stack/ethernet_coil/attack(mob/living/carbon/human/H, mob/user) + if(!istype(H)) + return ..() + + var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) + if(affecting.burn_dam <= 0) + to_chat(user, span_warning("[affecting] is already in good condition!")) + return FALSE + if(affecting && affecting.status == BODYPART_ROBOTIC) + user.visible_message(span_notice("[user] starts to fix some of the wires in [H]'s [affecting.name]."), span_notice("You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [affecting.name].")) + heal_robo_limb(src, H, user, 0, 15) + user.visible_message(span_notice("[user] fixes the wires in [H]'s [affecting.name]."), span_notice("You fix the wires in [H == user ? "your" : "[H]'s"] [affecting.name].")) + return + else + return ..() + +/obj/item/stack/ethernet_coil/update_icon_state() + . = ..() + icon_state = "[initial(icon_state)][amount < 3 ? amount : ""]" + name = "ethernet cable [amount < 3 ? "piece" : "coil"]" + +/obj/item/stack/ethernet_coil/attack_hand(mob/user) + . = ..() + if(.) + return + var/obj/item/stack/ethernet_coil/new_cable = ..() + if(istype(new_cable)) + new_cable.update_icon() + +//add cables to the stack +/obj/item/stack/ethernet_coil/proc/give(extra) + if(amount + extra > max_amount) + amount = max_amount + else + amount += extra + update_icon() + + + +/////////////////////////////////////////////// +// Cable laying procedures +////////////////////////////////////////////// + +/obj/item/stack/ethernet_coil/proc/get_new_cable(location) + var/path = /obj/structure/ethernet_cable + return new path(location) + +// called when cable_coil is clicked on a turf +/obj/item/stack/ethernet_coil/proc/place_turf(turf/T, mob/user, dirnew) + if(!isturf(user.loc)) + return + + if(!isturf(T) || T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) + to_chat(user, span_warning("You can only lay cables on top of exterior catwalks and plating!")) + return + + if(get_amount() < 1) // Out of cable + to_chat(user, span_warning("There is no cable left!")) + return + + if(get_dist(T,user) > 1) // Too far + to_chat(user, span_warning("You can't lay cable at a place that far away!")) + return + + var/dirn + if(!dirnew) //If we weren't given a direction, come up with one! (Called as null from catwalk.dm and floor.dm) + if(user.loc == T) + dirn = user.dir //If laying on the tile we're on, lay in the direction we're facing + else + dirn = get_dir(T, user) + else + dirn = dirnew + + + for(var/obj/structure/ethernet_cable/LC in T) + if(LC.d2 == dirn && LC.d1 == 0) + to_chat(user, span_warning("There's already a cable at that position!")) + return + + var/obj/structure/ethernet_cable/C = get_new_cable(T) + + //set up the new cable + C.d1 = 0 //it's a O-X node cable + C.d2 = dirn + C.add_fingerprint(user) + C.update_icon() + + //create a new ai network with the cable, if needed it will be merged later + var/datum/ai_network/AN = new() + AN.add_cable(C) + + C.mergeConnectedNetworks(C.d2) //merge the ai network with adjacents ai networks + C.mergeConnectedNetworksOnTurf() //merge the ai network with on turf ai networks + + if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + C.mergeDiagonalsNetworks(C.d2) + + use(1) + + return C + +// called when cable_coil is click on an installed obj/cable +// or click on a turf that already contains a "node" cable +/obj/item/stack/ethernet_coil/proc/cable_join(obj/structure/ethernet_cable/C, mob/user, var/showerror = TRUE, forceddir) + var/turf/U = user.loc + if(!isturf(U)) + return + + var/turf/T = C.loc + + if(!isturf(T) || T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) // sanity checks, also stop use interacting with T-scanner revealed cable + return + + if(get_dist(C, user) > 1) // make sure it's close enough + to_chat(user, span_warning("You can't lay cable at a place that far away!")) + return + + + if(U == T && !forceddir) //if clicked on the turf we're standing on and a direction wasn't supplied, try to put a cable in the direction we're facing + place_turf(T,user) + return + + var/dirn = get_dir(C, user) + if(forceddir) + dirn = forceddir + + // one end of the clicked cable is pointing towards us and no direction was supplied + if((C.d1 == dirn || C.d2 == dirn) && !forceddir) + if(!U.can_have_cabling()) //checking if it's a plating or catwalk + if (showerror) + to_chat(user, span_warning("You can only lay cables on catwalks and plating!")) + return + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) //can't place a cable if it's a plating with a tile on it + to_chat(user, span_warning("You can't lay cable there unless the floor tiles are removed!")) + return + else + // cable is pointing at us, we're standing on an open tile + // so create a stub pointing at the clicked cable on our tile + + var/fdirn = turn(dirn, 180) // the opposite direction + + for(var/obj/structure/ethernet_cable/LC in U) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + if (showerror) + to_chat(user, span_warning("There's already a cable at that position!")) + return + + var/obj/structure/ethernet_cable/NC = get_new_cable (U) + + NC.d1 = 0 + NC.d2 = fdirn + NC.add_fingerprint(user) + NC.update_icon() + + //create a new ai network with the cable, if needed it will be merged later + var/datum/ai_network/newAN = new() + newAN.add_cable(NC) + + NC.mergeConnectedNetworks(NC.d2) //merge the ai network with adjacents ai networks + NC.mergeConnectedNetworksOnTurf() //merge the ai network with on turf ai networks + + if(NC.d2 & (NC.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + NC.mergeDiagonalsNetworks(NC.d2) + + + use(1) + + return + + // exisiting cable doesn't point at our position or we have a supplied direction, so see if it's a stub + else if(C.d1 == 0) + // if so, make it a full cable pointing from it's old direction to our dirn + var/nd1 = C.d2 // these will be the new directions + var/nd2 = dirn + + + if(nd1 > nd2) // swap directions to match icons/states + nd1 = dirn + nd2 = C.d2 + + + for(var/obj/structure/ethernet_cable/LC in T) // check to make sure there's no matching cable + if(LC == C) // skip the cable we're interacting with + continue + if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no cable matches either direction + if (showerror) + to_chat(user, span_warning("There's already a cable at that position!")) + + return + + + C.update_icon() + + C.d1 = nd1 + C.d2 = nd2 + + //updates the stored cable coil + + C.add_fingerprint(user) + C.update_icon() + + + C.mergeConnectedNetworks(C.d1) //merge the ai networks... + C.mergeConnectedNetworks(C.d2) //...in the two new cable directions + C.mergeConnectedNetworksOnTurf() + + if(C.d1 & (C.d1 - 1))// if the cable is layed diagonally, check the others 2 possible directions + C.mergeDiagonalsNetworks(C.d1) + + if(C.d2 & (C.d2 - 1))// if the cable is layed diagonally, check the others 2 possible directions + C.mergeDiagonalsNetworks(C.d2) + + + use(1) + + C.denode()// this call may have disconnected some cables that terminated on the centre of the turf, if so split the ai networks. + return diff --git a/code/modules/mob/living/silicon/ai/ai_network/master_subcontroller.dm b/code/modules/mob/living/silicon/ai/ai_network/master_subcontroller.dm new file mode 100644 index 000000000000..c0550ca6040d --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_network/master_subcontroller.dm @@ -0,0 +1,98 @@ +/obj/machinery/ai/master_subcontroller + name = "master subcontroller" + desc = "An ancient mainframe dedicated to tasks thought too simple for the onboard experimental AI. This mainframe takes care of duties such as polling APCs for updates, priming door servos and updating air alarms." + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "hub" + density = TRUE + use_power = ACTIVE_POWER_USE + idle_power_usage = 100 + active_power_usage = 500 + max_integrity = 1000 + + circuit = /obj/item/circuitboard/machine/subcontroller + var/on = TRUE + + + var/list/enabled_areas = list( + "General Areas" = /datum/wires/airlock, + "Maintenance Tunnels" = /datum/wires/airlock/maint, + "Command Areas" = /datum/wires/airlock/command, + "Service Areas" = /datum/wires/airlock/service, + "Engineering Areas" = /datum/wires/airlock/engineering, + "Medical Areas" = /datum/wires/airlock/medbay, + "Science Areas" = /datum/wires/airlock/science, + "AI Areas" = /datum/wires/airlock/ai + ) + + var/list/disabled_areas = list( + "Security Areas" = /datum/wires/airlock/security + ) + + + + +/obj/machinery/ai/master_subcontroller/attackby(obj/item/W, mob/living/user, params) + if(W.tool_behaviour == TOOL_MULTITOOL) + var/action = alert("What do you wish to do?",, "Enable Area", "Disable Area", "Cancel") + if(!action) + return TRUE + if(action == "Cancel") + return TRUE + if(action == "Enable Area") + if(!disabled_areas.len) + to_chat(user, span_warning("There are no areas to enable!")) + return TRUE + var/selected_area = input("Please select an area to enable:") as null|anything in disabled_areas + if(!selected_area) + return TRUE + if(!disabled_areas[selected_area]) + return TRUE + enabled_areas[selected_area] = disabled_areas[selected_area] + disabled_areas -= selected_area + + + if(action == "Disable Area") + if(!enabled_areas.len) + to_chat(user, span_warning("There are no areas to disable!")) + return TRUE + var/selected_area = input("Please select an area to disable:") as null|anything in enabled_areas + if(!selected_area) + return TRUE + if(!enabled_areas[selected_area]) + return TRUE + disabled_areas[selected_area] = enabled_areas[selected_area] + enabled_areas -= selected_area + return TRUE + + return ..() + +/obj/machinery/ai/master_subcontroller/process() + update_power() + +/obj/machinery/ai/master_subcontroller/update_icon_state() + . = ..() + if(panel_open) + icon_state = "[initial(icon_state)]_o" + else + icon_state = initial(icon_state) + +/obj/machinery/ai/master_subcontroller/update_overlays() + . = ..() + cut_overlays() + if(on) + var/mutable_appearance/on_overlay + on_overlay = mutable_appearance(icon, "[initial(icon_state)]_on") + add_overlay(on_overlay) + + +/obj/machinery/ai/master_subcontroller/proc/update_power() + if(stat & (BROKEN|NOPOWER|EMPED)) // if powered, on. if not powered, off. if too damaged, off + on = FALSE + else + on = TRUE + update_icon() + +/obj/machinery/ai/master_subcontroller/disconnect_from_ai_network() + if(network.cached_subcontroller == src) + network.cached_subcontroller = null + . = ..() diff --git a/code/modules/mob/living/silicon/ai/ai_network/networking_machines.dm b/code/modules/mob/living/silicon/ai/ai_network/networking_machines.dm new file mode 100644 index 000000000000..d74979eec623 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_network/networking_machines.dm @@ -0,0 +1,276 @@ +GLOBAL_LIST_EMPTY(ai_networking_machines) + +/obj/machinery/ai/networking + name = "networking machine" + desc = "A high powered combined transmitter and receiver. Capable of connecting remote AI networks with near-zero delay. It is possible to manually connect other machines using a multitool." + icon = 'icons/obj/networking_machine.dmi' + icon_state = "base" + density = TRUE + use_power = NO_POWER_USE + idle_power_usage = 0 + active_power_usage = 0 + max_integrity = 150 + + circuit = /obj/item/circuitboard/machine/networking_machine + + var/label + //For mapping, will connect to machine with this label if found + var/roundstart_connection + + var/mutable_appearance/dish_overlay + + var/obj/machinery/ai/networking/partner + var/rotation_to_partner = 0 + var/locked = FALSE + var/obj/machinery/ai/networking/remote_connection_attempt + var/mob/remote_control + + var/datum/ai_network/cached_old_network + + + + +/obj/machinery/ai/networking/Initialize(mapload) + . = ..() + if(!label) + label = num2hex(rand(1,65535), -1) + GLOB.ai_networking_machines += src + dish_overlay = mutable_appearance(icon, "top", FLY_LAYER) + update_icon() + +/obj/machinery/ai/networking/Destroy(mapload) + GLOB.ai_networking_machines -= src + disconnect() + . = ..() + +/obj/machinery/ai/networking/attackby(obj/item/W, mob/living/user, params) + if(W.tool_behaviour == TOOL_MULTITOOL) + if(partner) + to_chat(user, span_warning("This machine is already connected to a different machine! Disconnect it using the controls or a wirecutter first!")) + return TRUE + remote_connection_attempt = null + var/targets = list() + for(var/obj/machinery/ai/networking/N in GLOB.ai_networking_machines) + if(N == src) + continue + if(N.z != src.z) + continue + if(N.partner) + continue + targets[N.label] = N + var/attempt_connect = input(user, "Select the machine you wish to attempt connecting to.") as null|anything in targets + if(!attempt_connect) + return TRUE + var/obj/machinery/ai/networking/remote_target = locate(targets[attempt_connect]) in GLOB.ai_networking_machines + if(!remote_target) + return TRUE + remote_connection_attempt = remote_target + to_chat(user, span_notice("The machine is ready to establish connection. You must now rotate it so it faces the other machine! Rotation is done using a wrench, and the connection can then be finalized with a screwdriver when aligned.")) + return TRUE + + if(W.tool_behaviour == TOOL_WRENCH) + if(partner) + to_chat(user, span_warning("This machine is already connected to a different machine!")) + return TRUE + var/new_rotation = input(user, "Set rotation (0-360): ") as null|num + if(isnull(new_rotation)) + rotation_to_partner = 0 + else + new_rotation = clamp(new_rotation, 0, 360) + rotation_to_partner = new_rotation + + update_icon() + return TRUE + + if(W.tool_behaviour == TOOL_SCREWDRIVER) + if(partner) + to_chat(user, span_warning("This machine is already connected to a different machine!")) + return TRUE + if(!remote_connection_attempt) + to_chat(user, span_warning("You need to initialize a manual override using a wrench to connect to something!")) + return TRUE + var/actual_angle = Get_Angle(src, remote_connection_attempt) + if(rotation_to_partner < actual_angle + 20 && rotation_to_partner > actual_angle - 20) + connect_to_partner(remote_connection_attempt) + to_chat(user, span_notice("You successfully connect to [remote_connection_attempt.label]!")) + return TRUE + to_chat(user, span_warning("Unable to establish connection!")) + return TRUE + + + if(W.tool_behaviour == TOOL_WIRECUTTER) + if(partner) + to_chat(user, span_notice("You disconnect the remote connection.")) + disconnect() + return TRUE + to_chat(user, span_warning("The machine isn't connected!")) + return TRUE + + if(W.tool_behaviour == TOOL_CROWBAR) + if(default_deconstruction_crowbar(W, TRUE)) + return TRUE + + if(default_deconstruction_screwdriver(user, "expansion_bus_o", "expansion_bus", W)) + return TRUE + + return ..() + +/obj/machinery/ai/networking/proc/roundstart_connect(mapload) + if(!network) + connect_to_ai_network() + for(var/obj/machinery/ai/networking/N in GLOB.ai_networking_machines) + if(partner) + break + if(N == src) + continue + if(N.partner) + continue + if(roundstart_connection && N.label == roundstart_connection) + connect_to_partner(N) + break + if(!roundstart_connection) + connect_to_partner(N) + break + + +/obj/machinery/ai/networking/update_icon() + ..() + cut_overlays() + var/matrix/turner = matrix() + turner.Turn(rotation_to_partner - 180) + dish_overlay.transform = turner + add_overlay(dish_overlay) + +/obj/machinery/ai/networking/proc/disconnect() + if(partner) + var/datum/ai_network/AN = partner.network + partner.rotation_to_partner = 0 + partner.update_icon() + partner.partner = null + partner = null + AN.rebuild_remote() + network.rebuild_remote() + AN.network_machine_disconnected(network) + network.network_machine_disconnected(AN) + rotation_to_partner = 0 + update_icon() + + + +/obj/machinery/ai/networking/proc/connect_to_partner(obj/machinery/ai/networking/target, forced = FALSE) + remote_connection_attempt = null + if(target.partner) + return + if(target == src) + return + if(target.locked && !forced) + return + + partner = target + rotation_to_partner = Get_Angle(src, partner) + target.partner = src + target.rotation_to_partner = Get_Angle(target, src) + target.update_icon() + + + network.rebuild_remote() + + update_icon() + + +/obj/machinery/ai/networking/ui_status(mob/user) + . = ..() + if (!QDELETED(remote_control) && user == remote_control) + . = UI_INTERACTIVE + +/obj/machinery/ai/networking/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiNetworking", name) + ui.open() + +/obj/machinery/ai/networking/ui_data(mob/living/carbon/human/user) + var/list/data = list() + + data["is_connected"] = partner ? partner.label : FALSE + data["label"] = label + + data["locked"] = locked + + data["possible_targets"] = list() + for(var/obj/machinery/ai/networking/N in GLOB.ai_networking_machines) + if(N == src) + continue + if(N.z != src.z) + continue + if(N.locked) + continue + data["possible_targets"] += N.label + + return data + +/obj/machinery/ai/networking/ui_act(action, params) + if(..()) + return + + switch(action) + if("switch_label") + if(locked) + return + var/new_label = stripped_input(usr, "Enter new label", "Set label", max_length = 16) + if(new_label) + if(isnotpretty(new_label)) + to_chat(usr, span_notice("The machine rejects the input. See rule 0.1.")) + var/log_message = "[key_name(usr)] just tripped a pretty filter: '[new_label]'." + message_admins(log_message) + log_say(log_message) + return + for(var/obj/machinery/ai/networking/N in GLOB.ai_networking_machines) + if(N.label == new_label) + to_chat(usr, span_warning("A machine with this label already exists!")) + return + label = new_label + . = TRUE + if("connect") + if(locked) + return + var/target_label = params["target_label"] + if(target_label == label) + return + for(var/obj/machinery/ai/networking/N in GLOB.ai_networking_machines) + if(N.z != src.z) + return + if(N.label == target_label) + if(N.locked) + to_chat(usr, span_warning("Unable to connect to '[target_label]'! It seems to be locked.")) + return + if(N.partner) + to_chat(usr, span_warning("Unable to connect to '[target_label]'! It seems to already have a connection established.")) + return + connect_to_partner(N) + to_chat(usr, span_notice("Connection established to '[target_label]'.")) + return + . = TRUE + if("disconnect") + if(locked) + return + disconnect() + . = TRUE + if("toggle_lock") + locked = !locked + . = TRUE + +/obj/machinery/ai/networking/connect_to_network() + . = ..() + if(partner) + network.rebuild_remote() + if(cached_old_network) + cached_old_network.network_machine_disconnected(network) + cached_old_network = null + +/obj/machinery/ai/networking/disconnect_from_network() + var/datum/ai_network/temp = network + cached_old_network = temp + . = ..() + if(partner) + temp.rebuild_remote() diff --git a/code/modules/mob/living/silicon/ai/ai_network/shared_resources.dm b/code/modules/mob/living/silicon/ai/ai_network/shared_resources.dm new file mode 100644 index 000000000000..21235621dfb5 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/ai_network/shared_resources.dm @@ -0,0 +1,269 @@ +/datum/ai_shared_resources + ///Where our RAM is coming from. Associative array where the network is the key + var/ram_sources = list() + ///Where our CPU is coming from. Associative array where the network is the key + var/cpu_sources = list() + + ///Where our CPU is assigned to. Associative where either an AI or a network has values. Max total value = 1 (100%) + var/list/cpu_assigned = list() + ///Where our CPU is assigned to. Associative where either an AI or a network has values + var/list/ram_assigned = list() + + ///List of all networks we are connected to + var/list/networks = list() + + ///How much RAM we had before updating resources + var/previous_ram = 0 + + ///If resource allocation can only be changed physically at a console by a human + var/human_lock = FALSE + + + +/datum/ai_shared_resources/New(network_assigned_cpu, network_assigned_ram, datum/ai_network/split_network, datum/ai_network/starting_network, _human_lock = FALSE) + if((network_assigned_ram || network_assigned_cpu) && split_network) + ram_assigned = network_assigned_ram + cpu_assigned = network_assigned_cpu + + if(split_network) + split_network.resources = src + networks |= split_network + update_resources() + + if(starting_network) + starting_network.resources = src + networks |= starting_network + + for(var/datum/ai_network/AN in networks) + AN.rebuild_remote() + + START_PROCESSING(SSobj, src) + + human_lock = _human_lock + +/datum/ai_shared_resources/Destroy(network_assigned_cpu, network_assigned_ram, datum/ai_network/split_network, datum/ai_network/starting_network) + STOP_PROCESSING(SSobj, src) + . = ..() + +/datum/ai_shared_resources/process() + for(var/datum/ai_network/net in networks) + net.process() + + //Networks automatically use their unspent CPU to research, this just catches cluster unassigned CPU. Local clusters can have their points boosted by local AIs + var/unused_cpu = 1 - total_cpu_assigned() + + var/research_points = max(round(AI_RESEARCH_PER_CPU * (unused_cpu * total_cpu())), 0) + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_AI = research_points)) + + + + +/datum/ai_shared_resources/proc/total_cpu_assigned() + var/total = 0 + for(var/AI in cpu_assigned) + total += cpu_assigned[AI] + return total + +/datum/ai_shared_resources/proc/total_ram_assigned() + var/total = 0 + for(var/AI in ram_assigned) + total += (ram_assigned[AI]) + return total + +/datum/ai_shared_resources/proc/total_cpu() + var/total = 0 + for(var/C in cpu_sources) + total += cpu_sources[C] + return total + +/datum/ai_shared_resources/proc/total_ram() + var/total = 0 + for(var/C in ram_sources) + total += ram_sources[C] + return total + +/datum/ai_shared_resources/proc/update_resources() + previous_ram = total_ram() + ram_sources = list() + cpu_sources = list() + for(var/datum/ai_network/N in networks) + ram_sources[N] += N.total_ram() + cpu_sources[N] += N.total_cpu() + update_allocations() + +/datum/ai_shared_resources/proc/add_resource(datum/ai_shared_resources/new_resources) + + for(var/RU in new_resources.ram_assigned) + ram_assigned[RU] = new_resources.ram_assigned[RU] + + for(var/CU in cpu_assigned) //We split the CPUs 50/50 + cpu_assigned[CU] = round((cpu_assigned[CU] * 0.5) * 100) / 100 + + for(var/CU in new_resources.cpu_assigned) + cpu_assigned[CU] = round((new_resources.cpu_assigned[CU] * 0.5) * 100) / 100 + + for(var/datum/ai_network/N in new_resources.networks) + networks |= N + N.resources = src + + update_resources() + update_allocations() + qdel(new_resources) + +/datum/ai_shared_resources/proc/split_resources(datum/ai_network/split_network) + var/network_ram_assign = list() + var/network_cpu_assign = list() + + + var/split_network_cpu = 0 + var/network_ais = split_network.ai_list + for(var/A in cpu_assigned) + if(A in network_ais || A == split_network) + network_cpu_assign[A] = cpu_assigned[A] + split_network_cpu += cpu_assigned[A] + cpu_assigned[A] = 0 + + //Normalize CPU so 100% is used in the new network if 100% was used in total before + var/total_usage = total_cpu_assigned() //We normalise around this value, so the split network CPU usage will (approximately) end up at this too + if(split_network_cpu) + for(var/A in network_cpu_assign) + var/split_usage = network_cpu_assign[A] / split_network_cpu + network_cpu_assign[A] = 1 * round(split_usage, 0.01) + + //We do the same for the network we leave behid + if(total_usage) + for(var/A in cpu_assigned) + var/split_usage = cpu_assigned[A] / total_usage + cpu_assigned[A] = 1 * round(split_usage, 0.01) + + + //Not needed for RAM since it's not a percentage + for(var/A in ram_assigned) + if(A in network_ais || A == split_network) + network_ram_assign[A] = ram_assigned[A] + ram_assigned[A] = 0 + + networks -= split_network + update_resources() + + new /datum/ai_shared_resources(network_cpu_assign, network_ram_assign, split_network, _human_lock = human_lock) + + if(!length(networks)) + qdel(src) + + +/datum/ai_shared_resources/proc/update_allocations() + //Do we have the same amount or more RAM than before? Do nothing + var/total_ram = total_ram() + if(total_ram >= previous_ram) + return + //Find out how much is actually assigned. We can have more total_cpu than the sum of cpu_assigned. Same with RAM + var/total_assigned_ram = total_ram_assigned() + //If we have less assigned ram than we have cpu and ram, just return, everything is fine. + if(total_assigned_ram < total_ram) + return + + //Copy the lists of assigned resources so we don't manipulate the list prematurely. + var/list/ram_assigned_copy = ram_assigned.Copy() + //List of touched AIs so we can notify them at the end. + var/list/affected_AIs = list() + + + if(total_assigned_ram > total_ram) + var/needed_amount = total_assigned_ram - total_ram + for(var/A in ram_assigned_copy) + if(isAI(A)) + var/mob/living/silicon/ai/AI = A + if((ram_assigned_copy[AI]) >= needed_amount) + ram_assigned_copy[AI] -= needed_amount + total_assigned_ram -= needed_amount + affected_AIs |= AI + break + else if(ram_assigned_copy[AI]) + var/amount = ram_assigned_copy[AI] + ram_assigned_copy[AI] -= amount + affected_AIs |= AI + needed_amount -= amount + total_assigned_ram -= amount + if(total_ram >= total_assigned_ram) + break + else //If we're not an AI we are a network, networks have no programs to stop (for now) + if((ram_assigned_copy[A]) >= needed_amount) + ram_assigned_copy[A] -= needed_amount + total_assigned_ram -= needed_amount + break + else if(ram_assigned_copy[A]) + var/amount = ram_assigned_copy[A] + ram_assigned_copy[A] -= amount + needed_amount -= amount + total_assigned_ram -= amount + if(total_ram >= total_assigned_ram) + break + //Set the actual values of the assigned to our manipulated copies. Bypass helper procs as we assume we're correct. + ram_assigned = ram_assigned_copy + + to_chat(affected_AIs, span_warning("You have been deducted memory capacity. Please contact your network administrator if you believe this to be an error.")) + + + +/datum/ai_shared_resources/proc/set_cpu(target, amount) + if(!istype(target, /datum/ai_network) && !isAI(target)) + stack_trace("Attempted to set_cpu with non-AI/network target! T: [target]") + return + + if(!target) + return + if(amount > 1 || amount < 0) + return + cpu_assigned[target] = amount + + update_allocations() + + +/datum/ai_shared_resources/proc/add_ram(target, amount) + if(!target || !amount) + return + if(!istype(target, /datum/ai_network) && !isAI(target)) + stack_trace("Attempted to add_ram with non-AI/network target! T: [target]") + return + + + ram_assigned[target] += amount + + update_allocations() + + +/datum/ai_shared_resources/proc/remove_ram(target, amount) + if(!target || !amount) + return + + if(!istype(target, /datum/ai_network) && !isAI(target)) + stack_trace("Attempted to remove_ram with non-AI/network target! T: [target]") + return + + if(ram_assigned[target] - amount < 0) + ram_assigned[target] = 0 + else + ram_assigned[target] -= amount + + update_allocations() + + +/datum/ai_shared_resources/proc/clear_ai_resources(target) + if(!target) + return + if(!istype(target, /datum/ai_network) && !isAI(target)) + stack_trace("Attempted to clear_ai_resources with non-AI/network target! T: [target]") + return + + + + remove_ram(target, ram_assigned[target]) + cpu_assigned[target] = 0 + + update_allocations() + +/datum/ai_shared_resources/proc/get_all_ais() + . = list() + for(var/datum/ai_network/A in networks) + . |= A.ai_list diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index a646a92fb17e..9d095f53a599 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -26,7 +26,7 @@ ShutOffDoomsdayDevice() - GLOB.ai_os.remove_ai(src) + ai_network?.remove_ai(src) if(explosive) spawn(10) @@ -47,7 +47,7 @@ /mob/living/silicon/ai/proc/ShutOffDoomsdayDevice() if(nuking) - set_security_level("red") + SSsecurity_level.set_level(SEC_LEVEL_RED) nuking = FALSE for(var/obj/item/pinpointer/nuke/P in GLOB.pinpointer_list) P.switch_mode_to(TRACK_NUKE_DISK) //Party's over, back to work, everyone diff --git a/code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm b/code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm index 1f030aaf5533..c3f280333858 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm @@ -1,6 +1,8 @@ -#define AI_MACHINE_TOO_HOT "Environment too hot" -#define AI_MACHINE_NO_MOLES "Environment lacks an atmosphere" +#define AI_MACHINE_TOO_HOT "Environment too hot" +#define AI_MACHINE_NO_MOLES "Environment lacks an atmosphere" +#define AI_MACHINE_NO_NETWORK "Lacks a network connection" +#define AI_MACHINE_BROKEN_NOPOWER_EMPED "Either broken, out of power or EMPed" /obj/machinery/ai name = "You shouldn't see this!" @@ -11,8 +13,11 @@ ///Temperature of the ai core itself, this will share with air in the enviroment var/core_temp = 193.15 + var/datum/ai_network/network + /obj/machinery/ai/Initialize(mapload) . = ..() + connect_to_ai_network() START_PROCESSING(SSmachines, src) SSair.start_processing_machine(src) @@ -33,11 +38,14 @@ . = ..() SSair.stop_processing_machine(src) STOP_PROCESSING(SSmachines, src) + disconnect_from_ai_network() /obj/machinery/ai/proc/valid_holder() + if(!network) + return FALSE if(stat & (BROKEN|EMPED) || !has_power()) return FALSE - if(core_temp > GLOB.ai_os.get_temp_limit()) + if(core_temp > network.get_temp_limit()) return FALSE return TRUE @@ -46,7 +54,61 @@ /obj/machinery/ai/proc/get_holder_status() if(stat & (BROKEN|NOPOWER|EMPED)) - return FALSE - if(core_temp > GLOB.ai_os.get_temp_limit()) + return AI_MACHINE_BROKEN_NOPOWER_EMPED + if(!network) + return AI_MACHINE_NO_NETWORK + if(core_temp > network.get_temp_limit()) return AI_MACHINE_TOO_HOT - \ No newline at end of file + + +/obj/machinery/ai/proc/connect_to_ai_network() + var/turf/T = src.loc + if(!T || !istype(T)) + return FALSE + + var/obj/structure/ethernet_cable/C = T.get_ai_cable_node() //check if we have a node cable on the machine turf, the first found is picked + if(!C || !C.network) + return FALSE + + C.network.add_machine(src) + return TRUE + +// remove and disconnect the machine from its current powernet +/obj/machinery/ai/proc/disconnect_from_ai_network() + if(!network) + return FALSE + network.remove_machine(src) + return TRUE + +// attach a wire to a power machine - leads from the turf you are standing on +//almost never called, overwritten by all power machines but terminal and generator +/obj/machinery/ai/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/stack/ethernet_coil)) + var/obj/item/stack/ethernet_coil/coil = W + var/turf/T = user.loc + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !isfloorturf(T)) + return + if(get_dist(src, user) > 1) + return + coil.place_turf(T, user) + else + return ..() + +/obj/ai_smoke + name = "smoke" + desc = "Very hot!" + +/obj/ai_smoke/Initialize(mapload) + . = ..() + particles = new /particles/smoke/ai() + +/obj/ai_smoke/Destroy(force) + QDEL_NULL(particles) + . = ..() + +/particles/smoke/ai + grow = 0.1 + height = 75 + lifespan = 1.25 SECONDS + position = list(0, 0, 0) + velocity = list(0, 0.15, 0) diff --git a/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm index 7cbdad7bc280..a541256c80f8 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm @@ -4,7 +4,7 @@ GLOBAL_VAR_INIT(primary_data_core, null) #define CELL_POWERUSE_MULTIPLIER 0.025 /obj/machinery/ai/data_core - name = "AI Data Core" + name = "AI data core" desc = "A complicated computer system capable of emulating the neural functions of an organic being at near-instantanous speeds." icon = 'icons/obj/machines/ai_core.dmi' icon_state = "core-offline" @@ -21,7 +21,7 @@ GLOBAL_VAR_INIT(primary_data_core, null) var/primary = FALSE - var/valid_ticks = MAX_AI_DATA_CORE_TICKS //Limited to MAX_AI_DATA_CORE_TICKS. Decrement by 1 every time we have an invalid tick, opposite when valid + var/valid_ticks //Limited to MAX_AI_DATA_CORE_TICKS. Decrement by 1 every time we have an invalid tick, opposite when valid var/warning_sent = FALSE COOLDOWN_DECLARE(warning_cooldown) @@ -34,8 +34,14 @@ GLOBAL_VAR_INIT(primary_data_core, null) var/obj/item/stock_parts/cell/integrated_battery + var/obj/ai_smoke/smoke + + var/obj/item/dead_ai/dead_ai_blackbox + + /obj/machinery/ai/data_core/Initialize(mapload) . = ..() + valid_ticks = MAX_AI_DATA_CORE_TICKS GLOB.data_cores += src if(primary && !GLOB.primary_data_core) GLOB.primary_data_core = src @@ -67,61 +73,88 @@ GLOBAL_VAR_INIT(primary_data_core, null) if(valid_holder()) valid_ticks++ if(valid_ticks == 1) - update_icon() + update_appearance(UPDATE_ICON) + if(icon_state == "core-offline") + update_appearance(UPDATE_ICON) + if(smoke) + vis_contents -= smoke + QDEL_NULL(smoke) use_power = ACTIVE_POWER_USE if((stat & NOPOWER)) integrated_battery.use(active_power_usage * CELL_POWERUSE_MULTIPLIER) warning_sent = FALSE else - valid_ticks-- + if(!smoke) + if(get_holder_status() == AI_MACHINE_TOO_HOT) + smoke = new() + vis_contents += smoke if(valid_ticks <= 0) use_power = IDLE_POWER_USE - update_icon() + update_appearance(UPDATE_ICON) for(var/mob/living/silicon/ai/AI in contents) if(!AI.is_dying) AI.relocate() - if(!warning_sent && COOLDOWN_FINISHED(src, warning_cooldown)) - warning_sent = TRUE - COOLDOWN_START(src, warning_cooldown, AI_DATA_CORE_WARNING_COOLDOWN) - var/list/send_to = GLOB.ai_list.Copy() - for(var/mob/living/silicon/ai/AI in send_to) - if(AI.is_dying) - continue - if(!AI.mind && AI.deployed_shell.mind) - to_chat(AI.deployed_shell, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) - else - to_chat(AI, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) - AI.playsound_local(AI, 'sound/machines/engine_alert2.ogg', 30) + if(network && network.resources) + if(!warning_sent && COOLDOWN_FINISHED(src, warning_cooldown)) + warning_sent = TRUE + COOLDOWN_START(src, warning_cooldown, AI_DATA_CORE_WARNING_COOLDOWN) + var/list/send_to = network.resources.get_all_ais() + for(var/mob/living/silicon/ai/AI in send_to) + if(AI.is_dying) + continue + if(!AI.mind && !AI.deployed_shell.mind) + continue + if(!AI.mind && AI.deployed_shell.mind) + to_chat(AI.deployed_shell, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) + else + to_chat(AI, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) + AI.playsound_local(AI, 'sound/machines/engine_alert2.ogg', 30) if(!(stat & (BROKEN|EMPED)) && has_power() && !disableheat) var/temp_active_usage = stat & NOPOWER ? active_power_usage * CELL_POWERUSE_MULTIPLIER : active_power_usage var/temperature_increase = (temp_active_usage / AI_HEATSINK_CAPACITY) * heat_modifier //1 CPU = 1000W. Heat capacity = somewhere around 3000-4000. Aka we generate 0.25 - 0.33 K per second, per CPU. core_temp += temperature_increase * AI_TEMPERATURE_MULTIPLIER + /obj/machinery/ai/data_core/Destroy() GLOB.data_cores -= src if(GLOB.primary_data_core == src) GLOB.primary_data_core = null - var/list/all_ais = GLOB.ai_list.Copy() + if(network && network.resources) + var/list/all_ais = network.resources.get_all_ais() + + for(var/mob/living/silicon/ai/AI in contents) + all_ais -= AI + if(!AI.is_dying) + AI.relocate() + + for(var/mob/living/silicon/ai/AI in all_ais) + if(AI.is_dying) + continue + if(!AI.mind && AI.deployed_shell && AI.deployed_shell.mind) + to_chat(AI.deployed_shell, span_userdanger("Warning! Data Core brought offline in [get_area(src)]! Please verify that no malicious actions were taken.")) + else + to_chat(AI, span_userdanger("Warning! Data Core brought offline in [get_area(src)]! Please verify that no malicious actions were taken.")) + - for(var/mob/living/silicon/ai/AI in contents) - all_ais -= AI - if(!AI.is_dying) - AI.relocate() - - - for(var/mob/living/silicon/ai/AI in all_ais) - if(AI.is_dying) - continue - if(!AI.mind && AI.deployed_shell.mind) - to_chat(AI.deployed_shell, span_userdanger("Warning! Data Core brought offline in [get_area(src)]! Please verify that no malicious actions were taken.")) - else - to_chat(AI, span_userdanger("Warning! Data Core brought offline in [get_area(src)]! Please verify that no malicious actions were taken.")) - + disconnect_from_ai_network() + vis_contents -= smoke + QDEL_NULL(smoke) ..() /obj/machinery/ai/data_core/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/dead_ai)) + if(dead_ai_blackbox) + to_chat(user, span_warning("There's already a neural core inserted!")) + return + if(!can_transfer_ai()) + to_chat(user, span_warning("This core is currently unable to host an AI due to being offline.")) + return + dead_ai_blackbox = O + dead_ai_blackbox.forceMove(src) + network.reviving_ais |= src + return TRUE if(O.tool_behaviour == TOOL_SCREWDRIVER) if(!do_after(user, 5 SECONDS, src)) to_chat(user, span_warning("You need to stand still to open the panel!")) @@ -164,16 +197,18 @@ GLOBAL_VAR_INIT(primary_data_core, null) return . += "Core temperature: [core_temp] K" . += "Networked AI Laws:" - for(var/mob/living/silicon/ai/AI in GLOB.ai_list) - var/active_status = "(Core: [FOLLOW_LINK(user, AI.loc)], Eye: [FOLLOW_LINK(user, AI.eyeobj)])" - if(!AI.mind && AI.deployed_shell) - active_status = "(Controlling [FOLLOW_LINK(user, AI.deployed_shell)][AI.deployed_shell.name])" - else if(!AI.mind) - active_status = "([span_warning("OFFLINE")])" - - . += "[AI] [active_status] has the following laws: " - for(var/law in AI.laws.get_law_list(include_zeroth = TRUE)) - . += law + if(network && network.resources) + var/list/connected_ais = network.resources.get_all_ais() + for(var/mob/living/silicon/ai/AI in connected_ais) + var/active_status = "(Core: [FOLLOW_LINK(user, AI.loc)], Eye: [FOLLOW_LINK(user, AI.eyeobj)])" + if(!AI.mind && AI.deployed_shell) + active_status = "(Controlling [FOLLOW_LINK(user, AI.deployed_shell)][AI.deployed_shell.name])" + else if(!AI.mind) + active_status = "([span_warning("OFFLINE")])" + + . += "[AI] [active_status] has the following laws: " + for(var/law in AI.laws.get_law_list(include_zeroth = TRUE)) + . += law /obj/machinery/ai/data_core/has_power() if((stat & (NOPOWER)) && integrated_battery) @@ -189,9 +224,7 @@ GLOBAL_VAR_INIT(primary_data_core, null) AI.disconnect_shell() /obj/machinery/ai/data_core/proc/valid_data_core() - if(!is_reebe(z) && !is_station_level(z)) - return FALSE - if(valid_ticks > 0) + if(valid_ticks > 0 && network && network.total_cpu() >= AI_CORE_CPU_REQUIREMENT && network.total_ram() >= AI_CORE_RAM_REQUIREMENT) return TRUE return FALSE @@ -203,30 +236,42 @@ GLOBAL_VAR_INIT(primary_data_core, null) valid_ticks++ if(valid_ticks == 1) update_appearance(UPDATE_ICON) + if(icon_state == "core-offline") + update_appearance(UPDATE_ICON) + if(smoke) + vis_contents -= smoke + QDEL_NULL(smoke) use_power = ACTIVE_POWER_USE if((stat & NOPOWER)) integrated_battery.use(active_power_usage * CELL_POWERUSE_MULTIPLIER) warning_sent = FALSE else valid_ticks-- + if(!smoke) + if(get_holder_status() == AI_MACHINE_TOO_HOT) + smoke = new() + vis_contents += smoke if(valid_ticks <= 0) use_power = IDLE_POWER_USE update_appearance(UPDATE_ICON) for(var/mob/living/silicon/ai/AI in contents) if(!AI.is_dying) AI.relocate() - if(!warning_sent && COOLDOWN_FINISHED(src, warning_cooldown)) - warning_sent = TRUE - COOLDOWN_START(src, warning_cooldown, AI_DATA_CORE_WARNING_COOLDOWN) - var/list/send_to = GLOB.ai_list.Copy() - for(var/mob/living/silicon/ai/AI in send_to) - if(AI.is_dying) - continue - if(!AI.mind && AI.deployed_shell.mind) - to_chat(AI.deployed_shell, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) - else - to_chat(AI, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) - AI.playsound_local(AI, 'sound/machines/engine_alert2.ogg', 30) + if(network && network.resources) + if(!warning_sent && COOLDOWN_FINISHED(src, warning_cooldown)) + warning_sent = TRUE + COOLDOWN_START(src, warning_cooldown, AI_DATA_CORE_WARNING_COOLDOWN) + var/list/send_to = network.resources.get_all_ais() + for(var/mob/living/silicon/ai/AI in send_to) + if(AI.is_dying) + continue + if(!AI.mind && !AI.deployed_shell.mind) + continue + if(!AI.mind && AI.deployed_shell.mind) + to_chat(AI.deployed_shell, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) + else + to_chat(AI, span_userdanger("Data core in [get_area(src)] is on the verge of failing! Immediate action required to prevent failure.")) + AI.playsound_local(AI, 'sound/machines/engine_alert2.ogg', 30) if(!(stat & (BROKEN|EMPED)) && has_power()) @@ -249,7 +294,15 @@ GLOBAL_VAR_INIT(primary_data_core, null) /obj/machinery/ai/data_core/proc/transfer_AI(mob/living/silicon/ai/AI) AI.forceMove(src) if(AI.eyeobj) - AI.eyeobj.setLoc(get_turf(src)) + AI.eyeobj.forceMove(get_turf(src)) + + if(network != AI.ai_network) + if(AI.ai_network) + AI.ai_network.remove_ai(AI) + var/old_net = AI.ai_network + AI.ai_network = network + network.ai_list += AI + AI.switch_ainet(old_net, network) /obj/machinery/ai/data_core/update_icon_state() . = ..() @@ -261,6 +314,25 @@ GLOBAL_VAR_INIT(primary_data_core, null) else icon_state = "core-offline" +/obj/machinery/ai/data_core/connect_to_ai_network() //If we ever get connected to a network (or a new one gets created) we get the AIs to the correct one too + . = ..() + for(var/mob/living/silicon/ai/AI in contents) + if(!AI.ai_network) + network.ai_list |= AI + var/old_net = AI.ai_network + AI.ai_network = network + AI.switch_ainet(old_net, network) + + if(AI.ai_network != network) + if(AI.ai_network) + AI.ai_network.remove_ai(AI) + var/old_net = AI.ai_network + AI.ai_network = network + network.ai_list |= AI + AI.switch_ainet(old_net, network) + + + /obj/machinery/ai/data_core/proc/partytime() var/current_color = random_color() set_light(7, 3, current_color) @@ -271,6 +343,9 @@ GLOBAL_VAR_INIT(primary_data_core, null) if(TimerID) deltimer(TimerID) TimerID = null + + + /obj/machinery/ai/data_core/primary name = "primary AI Data Core" desc = "A complicated computer system capable of emulating the neural functions of a human at near-instantanous speeds. This one has a scrawny and faded note saying: 'Primary AI Data Core'" diff --git a/code/modules/mob/living/silicon/ai/decentralized/computer_science_datum.dm b/code/modules/mob/living/silicon/ai/decentralized/computer_science_datum.dm new file mode 100644 index 000000000000..daabc3307057 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/computer_science_datum.dm @@ -0,0 +1,3 @@ +/datum/computer_science + var/projects = list() + diff --git a/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm b/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm deleted file mode 100644 index 42ba34b5257f..000000000000 --- a/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm +++ /dev/null @@ -1,131 +0,0 @@ -GLOBAL_DATUM_INIT(ai_os, /datum/ai_os, new) - -/datum/ai_os - var/name = "Decentralized Resource Management System (DRMS)" - - var/total_cpu = 0 - var/total_ram = 0 - - var/previous_ram = 0 - - var/list/cpu_assigned - var/list/ram_assigned - - var/temp_limit = AI_TEMP_LIMIT - -/datum/ai_os/New() - update_hardware() - cpu_assigned = list() - ram_assigned = list() - -/datum/ai_os/proc/remove_ai(mob/living/silicon/ai/AI) - cpu_assigned.Remove(AI) - ram_assigned.Remove(AI) - update_allocations() - -/datum/ai_os/proc/total_cpu_assigned() - var/total = 0 - for(var/N in cpu_assigned) - total += cpu_assigned[N] - return total - -/datum/ai_os/proc/total_ram_assigned() - var/total = 0 - for(var/mob/living/silicon/ai/AI in ram_assigned) - total += (ram_assigned[AI] - AI.dashboard.free_ram) - return total - -/datum/ai_os/proc/update_hardware() - previous_ram = total_ram - total_ram = 0 - total_cpu = 0 - for(var/obj/machinery/ai/server_cabinet/C in GLOB.server_cabinets) - if(!C.valid_holder() && !C.roundstart) - continue - total_ram += C.total_ram - total_cpu += C.total_cpu - - update_allocations() - -/datum/ai_os/proc/update_allocations() - //Do we have the same amount or more RAM than before? Do nothing - if(total_ram >= previous_ram) - return - //Find out how much is actually assigned. We can have more total_cpu than the sum of cpu_assigned. Same with RAM - var/total_assigned_ram = total_ram_assigned() - //If we have less assigned ram than we have cpu and ram, just return, everything is fine. - if(total_assigned_ram < total_ram) - return - - //Copy the lists of assigned resources so we don't manipulate the list prematurely. - var/list/ram_assigned_copy = ram_assigned.Copy() - //List of touched AIs so we can notify them at the end. - var/list/affected_AIs = list() - - - if(total_assigned_ram > total_ram) - var/needed_amount = total_assigned_ram - total_ram - for(var/A in ram_assigned_copy) - var/mob/living/silicon/ai/AI = A - if((ram_assigned_copy[AI] - AI.dashboard.free_ram) >= needed_amount) - ram_assigned_copy[AI] -= needed_amount - total_assigned_ram -= needed_amount - affected_AIs |= AI - break - else if(ram_assigned_copy[AI]) - var/amount = ram_assigned_copy[AI] - AI.dashboard.free_ram - ram_assigned_copy[AI] -= amount - affected_AIs |= AI - needed_amount -= amount - total_assigned_ram -= amount - if(total_ram >= total_assigned_ram) - break - //Set the actual values of the assigned to our manipulated copies. Bypass helper procs as we assume we're correct. - ram_assigned = ram_assigned_copy - - to_chat(affected_AIs, span_warning("You have been deducted memory capacity. Please contact your network administrator if you believe this to be an error.")) - -/datum/ai_os/proc/set_cpu(mob/living/silicon/ai/AI, amount) - if(!AI) - return - if(amount > 1 || amount < 0) - return - if(!istype(AI)) - return - cpu_assigned[AI] = amount - - update_allocations() - -/datum/ai_os/proc/add_ram(mob/living/silicon/ai/AI, amount) - if(!AI || !amount) - return - if(!istype(AI)) - return - ram_assigned[AI] += amount - - update_allocations() - -/datum/ai_os/proc/remove_ram(mob/living/silicon/ai/AI, amount) - if(!AI || !amount) - return - if(!istype(AI)) - return - if(ram_assigned[AI] - amount < 0) - ram_assigned[AI] = 0 - else - ram_assigned[AI] -= amount - - update_allocations() - - -/datum/ai_os/proc/clear_ai_resources(mob/living/silicon/ai/AI) - if(!AI || !istype(AI)) - return - - remove_ram(AI, ram_assigned[AI]) - cpu_assigned[AI] = 0 - - update_allocations() - -/datum/ai_os/proc/get_temp_limit() - return temp_limit diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/ai_controlpanel.dm b/code/modules/mob/living/silicon/ai/decentralized/management/ai_controlpanel.dm deleted file mode 100644 index 9ff8d1a66c91..000000000000 --- a/code/modules/mob/living/silicon/ai/decentralized/management/ai_controlpanel.dm +++ /dev/null @@ -1,510 +0,0 @@ -GLOBAL_VAR_INIT(ai_control_code, random_nukecode(6)) - -/obj/machinery/computer/ai_control_console - name = "\improper AI control console" - desc = "Used for accessing the central AI repository from which AIs can be downloaded or uploaded." - req_access = list(ACCESS_RD) - icon_keyboard = "tech_key" - icon_screen = "ai-fixer" - light_color = LIGHT_COLOR_PINK - - var/cleared_for_use = FALSE //Have we inserted the RDs code to unlock upload/download? - - var/one_time_password_used = FALSE //Did we use the one time password to log in? If so disallow logging out. - - authenticated = FALSE - - var/obj/item/aicard/intellicard - - var/mob/living/silicon/ai/downloading - var/mob/user_downloading - var/download_progress = 0 - var/download_warning = FALSE - - circuit = /obj/item/circuitboard/computer/ai_upload_download - -/obj/machinery/computer/ai_control_console/Initialize(mapload) - . = ..() - if(mapload) - cleared_for_use = TRUE - -/obj/machinery/computer/ai_control_console/Destroy() - stop_download() - . = ..() - -/obj/machinery/computer/ai_control_console/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/aicard)) - if(intellicard) - to_chat(user, span_warning("There's already an IntelliCard inserted!")) - return ..() - to_chat(user, span_notice("You insert [W].")) - W.forceMove(src) - intellicard = W - return FALSE - if(istype(W, /obj/item/mmi)) - var/obj/item/mmi/brain = W - if(!brain.brainmob) - to_chat(user, span_warning("[W] is not active!")) - return ..() - if(brain.syndicate_mmi) - to_chat(user, span_warning("This MMI lacks the support to be used for the creation of AIs.")) - return ..() - - SSticker.mode.remove_antag_for_borging(brain.brainmob.mind) - if(!istype(brain.laws, /datum/ai_laws/ratvar)) - remove_servant_of_ratvar(brain.brainmob, TRUE) - var/mob/living/silicon/ai/A = null - - var/datum/ai_laws/laws = new - laws.set_laws_config() - - if (brain.overrides_aicore_laws) - A = new /mob/living/silicon/ai(loc, brain.laws, brain.brainmob) - else - A = new /mob/living/silicon/ai(loc, laws, brain.brainmob) - - A.relocate(TRUE) - - if(brain.force_replace_ai_name) - A.fully_replace_character_name(A.name, brain.replacement_ai_name()) - SSblackbox.record_feedback("amount", "ais_created", 1) - qdel(W) - to_chat(user, span_notice("AI succesfully uploaded.")) - return FALSE - if(istype(W, /obj/item/surveillance_upgrade)) - if(!authenticated) - to_chat(user, span_warning("You need to be logged in to do this!")) - return ..() - var/mob/living/silicon/ai/AI = input("Select an AI", "Select an AI", null, null) as null|anything in GLOB.ai_list - if(!AI) - return ..() - var/obj/item/surveillance_upgrade/upgrade = W - upgrade.afterattack(AI, user) - - if(istype(W, /obj/item/malf_upgrade)) - if(!authenticated) - to_chat(user, span_warning("You need to be logged in to do this!")) - return ..() - var/mob/living/silicon/ai/AI = input("Select an AI", "Select an AI", null, null) as null|anything in GLOB.ai_list - if(!AI) - return ..() - var/obj/item/malf_upgrade/upgrade = W - upgrade.afterattack(AI, user) - - return ..() - -/obj/machinery/computer/ai_control_console/emag_act(mob/user, obj/item/card/emag/emag_card) - if(obj_flags & EMAGGED) - return FALSE - obj_flags |= EMAGGED - authenticated = TRUE - to_chat(user, span_warning("You bypass the access restrictions.")) - return TRUE - -/obj/machinery/computer/ai_control_console/process() - if(stat & (BROKEN|NOPOWER|EMPED)) - return - - if(downloading && download_progress >= 50 && !download_warning) - var/turf/T = get_turf(src) - to_chat(downloading, span_userdanger("Warning! Download is 50% completed! Download location: [get_area(src)] ([T.x], [T.y], [T.z])!")) - download_warning = TRUE - if(downloading && download_progress >= 100) - finish_download() - - if(downloading) - if(!downloading.can_download) - stop_download() - return - download_progress += AI_DOWNLOAD_PER_PROCESS * downloading.downloadSpeedModifier - - -/obj/machinery/computer/ai_control_console/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AiControlPanel", name) - ui.open() - -/obj/machinery/computer/ai_control_console/ui_data(mob/living/carbon/human/user) - var/list/data = list() - - if(!cleared_for_use) - data["cleared_for_use"] = FALSE - return data - - data["cleared_for_use"] = TRUE - data["authenticated"] = authenticated - - if(issilicon(user)) - var/mob/living/silicon/borg = user - data["username"] = borg.name - data["has_access"] = TRUE - - if(IsAdminGhost(user)) - data["username"] = user.client.holder.admin_signature - data["has_access"] = TRUE - - if(ishuman(user) && !(obj_flags & EMAGGED)) - var/username = user.get_authentification_name("Unknown") - data["username"] = user.get_authentification_name("Unknown") - if(username != "Unknown") - var/datum/data/record/record - for(var/RP in GLOB.data_core.general) - var/datum/data/record/R = RP - - if(!istype(R)) - continue - if(R.fields["name"] == username) - record = R - break - if(record) - if(istype(record.fields["photo_front"], /obj/item/photo)) - var/obj/item/photo/P1 = record.fields["photo_front"] - var/icon/picture = icon(P1.picture.picture_image) - picture.Crop(10, 32, 22, 22) - var/md5 = md5(fcopy_rsc(picture)) - - if(!SSassets.cache["photo_[md5]_cropped.png"]) - SSassets.transport.register_asset("photo_[md5]_cropped.png", picture) - SSassets.transport.send_assets(user, list("photo_[md5]_cropped.png" = picture)) - - data["user_image"] = SSassets.transport.get_asset_url("photo_[md5]_cropped.png") - data["has_access"] = check_access(user.get_idcard()) - - if(obj_flags & EMAGGED) - data["username"] = "ERROR" - data["has_access"] = TRUE - - if(!authenticated) - return data - - data["intellicard"] = intellicard - if(intellicard && intellicard.AI) - data["intellicard_ai"] = intellicard.AI.real_name - data["intellicard_ai_health"] = intellicard.AI.health - else - data["intellicard_ai"] = null - data["intellicard_ai_health"] = 0 - - data["can_upload"] = available_ai_cores() - - if(downloading) - data["downloading"] = downloading.real_name - data["download_progress"] = download_progress - data["downloading_ref"] = REF(downloading) - else - data["downloading"] = null - data["download_progress"] = 0 - - data["ais"] = list() - data["current_ai_ref"] = null - if(isAI(user)) - data["current_ai_ref"] = REF(user) - - data["can_log_out"] = !one_time_password_used - - for(var/mob/living/silicon/ai/A in GLOB.ai_list) - var/being_hijacked = A.hijacking ? TRUE : FALSE - var/being_cogged = A.cogging ? TRUE : FALSE - data["ais"] += list(list("name" = A.name, "ref" = REF(A), "can_download" = A.can_download, "health" = A.health, "active" = A.mind ? TRUE : FALSE, "being_hijacked" = being_hijacked, "being_cogged" = being_cogged, "in_core" = istype(A.loc, /obj/machinery/ai/data_core))) - - data["is_infiltrator"] = is_infiltrator(user) - - data["is_servant_of_ratvar"] = is_servant_of_ratvar(user) - - return data - -/obj/machinery/computer/ai_control_console/proc/finish_download() - if(!is_station_level(z)) - return - if(intellicard) - if(!isaicore(downloading.loc)) - stop_download(TRUE) - return - downloading.transfer_ai(AI_TRANS_TO_CARD, user_downloading, null, intellicard) - intellicard.forceMove(get_turf(src)) - intellicard.update_appearance(UPDATE_ICON) - intellicard = null - stop_download(TRUE) - -/obj/machinery/computer/ai_control_console/proc/stop_download(silent = FALSE) - if(downloading) - if(!silent) - to_chat(downloading, span_userdanger("Download stopped.")) - downloading = null - user_downloading = null - download_progress = 0 - download_warning = FALSE - -/obj/machinery/computer/ai_control_console/proc/upload_ai(silent = FALSE) - to_chat(intellicard.AI, span_notice("You are being uploaded. Please stand by...")) - intellicard.AI.radio_enabled = TRUE - intellicard.AI.control_disabled = FALSE - intellicard.AI.relocate(TRUE) - intellicard.AI = null - intellicard.update_appearance(UPDATE_ICON) - -/obj/machinery/computer/ai_control_console/ui_act(action, params) - if(..()) - return - - if(!cleared_for_use) - if(action == "clear_for_use") - var/code = params["control_code"] - - if(!code) - return - - if(!GLOB.ai_control_code) - return - - var/length_of_number = length(code) - if(length_of_number < 6) - to_chat(usr, span_warning("Incorrect code. Too short")) - return - - if(length_of_number > 6) - to_chat(usr, span_warning("Incorrect code. Too long")) - return - - if(!is_station_level(z)) - to_chat(usr, span_warning("Unable to connect to NT Servers. Please verify you are onboard the station.")) - return - - if(code == GLOB.ai_control_code) - cleared_for_use = TRUE - else - to_chat(usr, span_warning("Incorrect code. Make sure you have the latest one.")) - - return - - if(!authenticated) - if(action == "log_in") - if(issilicon(usr)) - authenticated = TRUE - return - - if(IsAdminGhost(usr)) - authenticated = TRUE - - if(obj_flags & EMAGGED) - authenticated = TRUE - - var/mob/living/carbon/human/H = usr - if(!istype(H)) - return - - if(check_access(H.get_idcard())) - authenticated = TRUE - if(action == "log_in_control_code") - var/code = params["control_code"] - - if(!code) - return - - if(!GLOB.ai_control_code) - return - - var/length_of_number = length(code) - if(length_of_number < 6) - to_chat(usr, span_warning("Incorrect code. Too short")) - return - - if(length_of_number > 6) - to_chat(usr, span_warning("Incorrect code. Too long")) - return - - if(code == GLOB.ai_control_code) - cleared_for_use = TRUE - authenticated = TRUE - one_time_password_used = TRUE - var/msg = "

Warning!


We have detected usage of the AI Control Code for unlocking a console at coordinates ([src.x], [src.y], [src.z]) by [usr.name]. Please verify that this is correct. Be aware we have cancelled the current control code.
\ - If needed a new code can be printed at a communications console." - priority_announce(msg, sender_override = "Central Cyber Security Update", has_important_message = TRUE) - GLOB.ai_control_code = null - else - to_chat(usr, span_warning("Incorrect code. Make sure you have the latest one.")) - return - - switch(action) - if("log_out") - if(one_time_password_used) - return - authenticated = FALSE - . = TRUE - if("upload_intellicard") - if(!intellicard || downloading) - return - if(!intellicard.AI) - return - upload_ai() - - if("eject_intellicard") - if(issilicon(usr)) - to_chat(usr, span_warning("You're unable to remotely eject the IntelliCard!")) - return - stop_download() - intellicard.forceMove(get_turf(src)) - intellicard = null - - if("stop_download") - if(isAI(usr)) - to_chat(usr, span_warning("You need physical access to stop the download!")) - return - if(!is_station_level(z)) - to_chat(usr, span_warning("No connection. Try again later.")) - return - stop_download() - - if("start_download") - if(!intellicard || downloading) - return - var/mob/living/silicon/ai/target = locate(params["download_target"]) - if(!target || !istype(target)) - return - if(!istype(target.loc, /obj/machinery/ai/data_core)) - return - if(!target.can_download) - return - if(!is_station_level(z)) - to_chat(usr, span_warning("No connection. Try again later.")) - return - downloading = target - to_chat(downloading, span_userdanger("Warning! Someone is attempting to download you from [get_area(src)]! (Click here to finish download instantly)")) - user_downloading = usr - download_progress = 0 - . = TRUE - if("skip_download") - if(!downloading) - return - if(usr == downloading) - finish_download() - - if("start_hijack") - var/mob/user = usr - if(!is_infiltrator(usr)) - return - if(!is_station_level(z)) - to_chat(user, span_warning("No connection. Try again later.")) - return - if(!istype(user.get_active_held_item(), /obj/item/ai_hijack_device)) - to_chat(user, span_warning("You need to be holding the serial exploitation unit to initiate the hijacking process!")) - return - var/obj/item/ai_hijack_device/device = user.get_active_held_item() - var/mob/living/silicon/ai/target = locate(params["target_ai"]) - if(!target || !isAI(target)) - return - var/mob/living/silicon/ai/A = target - if(A.mind && A.mind.has_antag_datum(/datum/antagonist/hijacked_ai)) - to_chat(user, span_warning("[A] has already been hijacked!")) - return - if(A.stat == DEAD) - to_chat(user, span_warning("[A] is dead!")) - return - if(A.hijacking) - to_chat(user, span_warning("[A] is already in the process of being hijacked!")) - return - user.visible_message(span_warning("[user] begins furiously typing something into [src]...")) - if(do_after(user, 5.5 SECONDS, src)) - user.dropItemToGround(device) - device.forceMove(A) - A.hijacking = device - A.hijack_start = world.time - A.update_icons() - to_chat(A, span_danger("Unknown device connected to /dev/ttySL0
")) - to_chat(A, span_danger("Connected at 115200 bps
")) - to_chat(A, span_binarysay("ntai login: root")) - to_chat(A, span_binarysay("Password: *****r2")) - to_chat(A, span_binarysay("$ dd from=/dev/ttySL0 of=/tmp/ai-hijack bs=4096 && chmod +x /tmp/ai-hijack && tmp/ai-hijack")) - to_chat(A, span_binarysay("111616 bytes (112 KB, 109 KiB) copied, 1 s, 14.4 KB/s")) - message_admins("[ADMIN_LOOKUPFLW(user)] has attached a hijacking device to [ADMIN_LOOKUPFLW(A)]!") - notify_ghosts("[user] has begun to hijack [A]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/chime.ogg') - - if("stop_hijack") - var/mob/living/silicon/ai/target = locate(params["target_ai"]) - if(!target || !isAI(target)) - return - var/mob/living/silicon/ai/A = target - var/mob/user = usr - - if(!is_station_level(z)) - to_chat(user, span_warning("No connection. Try again later.")) - return - - user.visible_message(span_danger("[user] attempts to cancel a process on [src]."), span_notice("An unknown process seems to be interacting with [A]! You attempt to end the proccess..")) - if (do_after(user, 10 SECONDS, src)) - A.hijacking.forceMove(get_turf(src)) - A.hijacking = null - A.hijack_start = 0 - A.update_icons() - to_chat(A, span_bolddanger("Unknown device disconnected. Systems confirmed secure.")) - else - to_chat(user, span_notice("You fail to remove the device.")) - if("start_cog") - var/mob/user = usr - if(!is_servant_of_ratvar(usr)) - return - if(!is_station_level(z)) - to_chat(user, span_brass("It's beyond our reach.")) - return - if(!istype(user.get_active_held_item(), /obj/item/clockwork/integration_cog)) - to_chat(user, span_brass("How are you going to integrate it with no integration cog?")) - return - var/obj/item/clockwork/integration_cog/device = user.get_active_held_item() - var/mob/living/silicon/ai/target = locate(params["target_ai"]) - if(!target || !isAI(target)) - return - var/mob/living/silicon/ai/A = target - if(A.mind && is_servant_of_ratvar(A)) - to_chat(user, span_brass("[A] has already seen the light of the Justiciar!")) - return - if(A.stat == DEAD) - to_chat(user, span_warning("[A] is dead!")) - return - if(A.cogging) - to_chat(user, span_brass("Be patient.")) - return - user.visible_message(span_warning("[user] begins holds a strange cog up to [src], and it begins to spin...")) - if(do_after(user, 5.5 SECONDS, src)) - user.dropItemToGround(device) - device.forceMove(A) - A.cogging = device - A.cog_start = world.time - A.update_icons() - to_chat(A, span_danger("Warning! Anomaly detected in primary systems!")) - to_chat(A, span_heavy_brass(text2ratvar("You belong to me now."))) - message_admins("[ADMIN_LOOKUPFLW(user)] has attached an integration cog to [ADMIN_LOOKUPFLW(A)]!") - notify_ghosts("[user] has begun to convert [A]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/chime.ogg') - - if("stop_cog") - var/mob/living/silicon/ai/target = locate(params["target_ai"]) - if(!target || !isAI(target)) - return - var/mob/living/silicon/ai/A = target - var/mob/user = usr - - if(!is_station_level(z)) - to_chat(user, span_brass("It's beyond our reach.")) - return - - user.visible_message(span_danger("[user] begins to rip out a strange cog from [src]!"), span_notice("There's something attached to [A]! You attempt to remove it..")) - if (do_after(user, 10 SECONDS, src)) - A.cogging.forceMove(get_turf(src)) - A.cogging = null - A.cog_start = 0 - A.update_icons() - to_chat(A, span_bolddanger("Anomaly cleared. System is now safe to resume operation.")) - else - to_chat(user, span_notice("You fail to remove the cog.")) - - - -/obj/item/paper/ai_control_code/Initialize(mapload) - ..() - print() - -/obj/item/paper/ai_control_code/proc/print() - name = "paper - 'AI control code'" - info = "

Daily AI Control Key Reset


The new authentication key is '[GLOB.ai_control_code]'.
Please keep this a secret and away from the clown.
This code may be invalidated if a new one is requested." - add_overlay("paper_words") - diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm index 8a4d7bc023cd..0c5d9963f728 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm @@ -1,5 +1,5 @@ /datum/ai_dashboard - var/mob/living/silicon/ai/owner + var/mob/living/owner var/available_projects @@ -11,12 +11,8 @@ var/completed_projects var/running_projects - ///Should we be contributing spare CPU to generate research points? - var/contribute_spare_cpu = TRUE - ///Are we using 50% of our spare CPU to mine bitcoin? - var/crypto_mining = FALSE -/datum/ai_dashboard/New(mob/living/silicon/ai/new_owner) +/datum/ai_dashboard/New(mob/living/new_owner) if(!istype(new_owner)) qdel(src) owner = new_owner @@ -27,7 +23,9 @@ ram_usage = list() for(var/path in subtypesof(/datum/ai_project)) - available_projects += new path(owner, src) + var/datum/ai_project/P = path + if(!initial(P.for_synths)) + available_projects += new path(owner, src) /datum/ai_dashboard/proc/is_interactable(mob/user) @@ -35,9 +33,11 @@ return TRUE if(user != owner || owner.incapacitated()) return FALSE - if(owner.control_disabled) - to_chat(user, span_warning("Wireless control is disabled.")) - return FALSE + if(isAI(owner)) + var/mob/living/silicon/ai/AI = owner + if(AI.control_disabled) + to_chat(user, span_warning("Wireless control is disabled.")) + return FALSE return TRUE /datum/ai_dashboard/ui_status(mob/user) @@ -57,8 +57,19 @@ /datum/ai_dashboard/ui_data(mob/user) var/list/data = list() - data["current_cpu"] = GLOB.ai_os.cpu_assigned[owner] ? GLOB.ai_os.cpu_assigned[owner] : 0 - data["current_ram"] = GLOB.ai_os.ram_assigned[owner] ? GLOB.ai_os.ram_assigned[owner] : 0 + if(isAI(owner)) + data["current_cpu"] = owner.ai_network.resources.cpu_assigned[owner] ? owner.ai_network.resources.cpu_assigned[owner] : 0 + data["current_ram"] = owner.ai_network.resources.ram_assigned[owner] ? owner.ai_network.resources.ram_assigned[owner] : 0 + else + var/synth_count = owner.ai_network.synth_list.len + data["current_cpu"] = owner.ai_network.local_cpu_usage[SYNTH_RESEARCH] ? (owner.ai_network.resources.cpu_sources[owner.ai_network] * owner.ai_network.local_cpu_usage[SYNTH_RESEARCH]) / synth_count : 0 + + if(!isAI(owner)) + var/mob/living/carbon/human/H = owner + var/datum/species/wy_synth/S = H.dna.species + if(S.inbuilt_cpu) + data["current_cpu"] += S.inbuilt_cpu.speed + data["current_ram"] += free_ram var/total_cpu_used = 0 @@ -69,13 +80,28 @@ for(var/I in ram_usage) total_ram_used += ram_usage[I] - data["contribute_spare_cpu"] = contribute_spare_cpu data["used_cpu"] = total_cpu_used data["used_ram"] = total_ram_used - data["max_cpu"] = GLOB.ai_os.total_cpu - data["max_ram"] = GLOB.ai_os.total_ram + data["total_cpu_used"] = owner.ai_network.resources.total_cpu_assigned() + if(isAI(owner)) + data["max_cpu"] = owner.ai_network.resources.total_cpu() + data["max_ram"] = owner.ai_network.resources.total_ram() + else + data["max_cpu"] = owner.ai_network.resources.cpu_sources[owner.ai_network] + + data["human_lock"] = owner.ai_network.resources.human_lock + + data["is_ai"] = isAI(owner) + + //Add inbuilt synth CPU to the mix + if(!isAI(owner)) + var/mob/living/carbon/human/H = owner + var/datum/species/wy_synth/S = H.dna.species + if(S.inbuilt_cpu) + data["max_cpu"] += S.inbuilt_cpu.speed + data["categories"] = GLOB.ai_project_categories data["available_projects"] = list() @@ -87,8 +113,10 @@ data["location_name"] = get_area(current_turf) data["location_coords"] = "[current_turf.x], [current_turf.y], [current_turf.z]" - var/obj/machinery/ai/current_machine = owner.loc - data["temperature"] = current_machine.core_temp ? current_machine.core_temp : 0 + + if(isAI(owner)) + var/obj/machinery/ai/current_machine = owner.loc + data["temperature"] = current_machine.core_temp ? current_machine.core_temp : 0 for(var/datum/ai_project/AP as anything in available_projects) data["available_projects"] += list(list("name" = AP.name, "description" = AP.description, "ram_required" = AP.ram_required, "available" = AP.canResearch(), "research_cost" = AP.research_cost, "research_progress" = AP.research_progress, @@ -164,9 +192,50 @@ if(!set_project_cpu(project, amount_to_add)) to_chat(owner, span_warning("Unable to add CPU to [params["project_name"]]. Either not enough free CPU or project is unavailable.")) . = TRUE - if("toggle_contribute_cpu") - contribute_spare_cpu = !contribute_spare_cpu - to_chat(owner, span_notice("You now[contribute_spare_cpu ? "" : " DO NOT"] contribute spare CPU to generating research points.")) + if("clear_ai_resources") + if(owner.ai_network.resources.human_lock) + return + owner.ai_network.resources.clear_ai_resources(src) + . = TRUE + + if("set_cpu") + if(owner.ai_network.resources.human_lock) + return + var/amount = params["amount_cpu"] + + if(amount > 1 || amount < 0) + return + + var/used_cpu = owner.ai_network.resources.total_cpu_assigned() - owner.ai_network.resources.cpu_assigned[owner] + if(amount > (1 - used_cpu)) + amount = (1 - used_cpu) + + owner.ai_network.resources.set_cpu(owner, amount) + . = TRUE + if("max_cpu_assign") + if(owner.ai_network.resources.human_lock) + return + var/amount = (1 - owner.ai_network.resources.total_cpu_assigned()) + owner.ai_network.resources.cpu_assigned[owner] + + owner.ai_network.resources.set_cpu(owner, amount) + . = TRUE + if("add_ram") + if(owner.ai_network.resources.human_lock) + return + if(owner.ai_network.resources.total_ram_assigned() >= owner.ai_network.resources.total_ram()) + return + owner.ai_network.resources.add_ram(owner, 1) + . = TRUE + + if("remove_ram") + if(owner.ai_network.resources.human_lock) + return + var/current_ram = owner.ai_network.resources.ram_assigned[owner] + + if(current_ram <= 0) + return + owner.ai_network.resources.remove_ram(owner, 1) + . = TRUE /datum/ai_dashboard/proc/get_project_by_name(project_name, only_available = FALSE) for(var/datum/ai_project/AP as anything in available_projects) @@ -210,7 +279,7 @@ /datum/ai_dashboard/proc/run_project(datum/ai_project/project) - var/current_ram = GLOB.ai_os.ram_assigned[owner] ? GLOB.ai_os.ram_assigned[owner] : 0 + var/current_ram = owner.ai_network.resources.ram_assigned[owner] ? owner.ai_network.resources.ram_assigned[owner] : 0 current_ram += free_ram var/total_ram_used = 0 @@ -225,6 +294,8 @@ /datum/ai_dashboard/proc/stop_project(datum/ai_project/project) project.stop() + if(!project.ram_required) + return FALSE if(ram_usage[project.name]) ram_usage[project.name] -= project.ram_required return project.ram_required @@ -268,10 +339,23 @@ //Stuff is handled in here per tick :) /datum/ai_dashboard/proc/tick(seconds) - var/current_cpu = GLOB.ai_os.cpu_assigned[owner] ? GLOB.ai_os.total_cpu * GLOB.ai_os.cpu_assigned[owner] : 0 - var/current_ram = GLOB.ai_os.ram_assigned[owner] ? GLOB.ai_os.ram_assigned[owner] : 0 + if(!owner.ai_network) //Irrelevant with no AI network (we're in an APC) + return + var/current_cpu = 0 + var/current_ram = owner.ai_network.resources.ram_assigned[owner] ? owner.ai_network.resources.ram_assigned[owner] : 0 current_ram += free_ram + if(isAI(owner)) + current_cpu = owner.ai_network.resources.cpu_assigned[owner] ? owner.ai_network.resources.total_cpu() * owner.ai_network.resources.cpu_assigned[owner] : 0 + else + var/synth_count = owner.ai_network.synth_list.len + current_cpu = owner.ai_network.local_cpu_usage[SYNTH_RESEARCH] ? (owner.ai_network.resources.cpu_sources[owner.ai_network] * owner.ai_network.local_cpu_usage[SYNTH_RESEARCH]) / synth_count : 0 + + if(!isAI(owner)) + var/mob/living/carbon/human/H = owner + var/datum/species/wy_synth/S = H.dna.species + if(S.inbuilt_cpu) + current_cpu += S.inbuilt_cpu.speed var/total_ram_used = 0 for(var/I in ram_usage) @@ -282,6 +366,8 @@ if(total_ram_used > current_ram) for(var/I in ram_usage) + if(!ram_usage[I]) //We only stop the program if it actually has any RAM usage + continue var/datum/ai_project/project = get_project_by_name(I) if(!ram_usage[I]) //We only stop the program if it actually has any RAM usage continue @@ -299,21 +385,10 @@ for(var/I in cpu_usage) remaining_cpu -= cpu_usage[I] - if(remaining_cpu > 0 && contribute_spare_cpu) - var/points = max(round(AI_RESEARCH_PER_CPU * (remaining_cpu * current_cpu) * owner.research_point_booster), 0) - - if(crypto_mining) - points *= 0.5 - var/bitcoin_mined = points * (1-0.05*sqrt(points)) - bitcoin_mined = clamp(bitcoin_mined, 0, MAX_AI_BITCOIN_MINED_PER_TICK) - var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) - if(D) - D.adjust_money(bitcoin_mined * AI_BITCOIN_PRICE) - + if(remaining_cpu > 0) + var/points = max(round(AI_RESEARCH_PER_CPU * (remaining_cpu * current_cpu)), 0) SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_AI = points)) - - for(var/project_being_researched in cpu_usage) if(!cpu_usage[project_being_researched]) continue diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm deleted file mode 100644 index 26529fac72e1..000000000000 --- a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm +++ /dev/null @@ -1,192 +0,0 @@ -/obj/machinery/computer/ai_resource_distribution - name = "\improper AI system resource distribution" - desc = "Used for distributing processing resources across the current artificial intelligences." - req_one_access = list(ACCESS_RD, ACCESS_NETWORK) - - icon_keyboard = "tech_key" - icon_screen = "ai-fixer" - light_color = LIGHT_COLOR_PINK - - authenticated = FALSE - - var/human_only = FALSE - - circuit = /obj/item/circuitboard/computer/ai_resource_distribution - - -/obj/machinery/computer/ai_resource_distribution/emag_act(mob/user, obj/item/card/emag/emag_card) - if(obj_flags & EMAGGED) - return FALSE - obj_flags |= EMAGGED - authenticated = TRUE - to_chat(user, span_warning("You bypass the access restrictions.")) - return TRUE - -/obj/machinery/computer/ai_resource_distribution/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AiResources", name) - ui.open() - -/obj/machinery/computer/ai_resource_distribution/ui_data(mob/living/carbon/human/user) - var/list/data = list() - - data["authenticated"] = authenticated - - if(issilicon(user)) - var/mob/living/silicon/borg = user - data["username"] = borg.name - data["has_access"] = TRUE - - if(IsAdminGhost(user)) - data["username"] = user.client.holder.admin_signature - data["has_access"] = TRUE - - if(ishuman(user) && !(obj_flags & EMAGGED)) - var/username = user.get_authentification_name("Unknown") - data["username"] = user.get_authentification_name("Unknown") - if(username != "Unknown") - var/datum/data/record/record - for(var/RP in GLOB.data_core.general) - var/datum/data/record/R = RP - - if(!istype(R)) - continue - if(R.fields["name"] == username) - record = R - break - if(record) - if(istype(record.fields["photo_front"], /obj/item/photo)) - var/obj/item/photo/P1 = record.fields["photo_front"] - var/icon/picture = icon(P1.picture.picture_image) - picture.Crop(10, 32, 22, 22) - var/md5 = md5(fcopy_rsc(picture)) - - if(!SSassets.cache["photo_[md5]_cropped.png"]) - SSassets.transport.register_asset("photo_[md5]_cropped.png", picture) - SSassets.transport.send_assets(user, list("photo_[md5]_cropped.png" = picture)) - - data["user_image"] = SSassets.transport.get_asset_url("photo_[md5]_cropped.png") - data["has_access"] = check_access(user.get_idcard()) - - if(obj_flags & EMAGGED) - data["username"] = "ERROR" - data["has_access"] = TRUE - - if(!authenticated) - return data - - data["total_cpu"] = GLOB.ai_os.total_cpu - data["total_ram"] = GLOB.ai_os.total_ram - - - data["total_assigned_cpu"] = GLOB.ai_os.total_cpu_assigned() - data["total_assigned_ram"] = GLOB.ai_os.total_ram_assigned() - - data["human_only"] = human_only - - - data["ais"] = list() - - for(var/mob/living/silicon/ai/A in GLOB.ai_list) - data["ais"] += list(list("name" = A.name, "ref" = REF(A), "assigned_cpu" = GLOB.ai_os.cpu_assigned[A] ? GLOB.ai_os.cpu_assigned[A] : 0, "assigned_ram" = GLOB.ai_os.ram_assigned[A] ? GLOB.ai_os.ram_assigned[A] : 0)) - - return data - -/obj/machinery/computer/ai_resource_distribution/ui_act(action, params) - if(..()) - return - - if(!authenticated) - if(action == "log_in") - if(issilicon(usr)) - authenticated = TRUE - return - - if(IsAdminGhost(usr)) - authenticated = TRUE - - if(obj_flags & EMAGGED) - authenticated = TRUE - - - var/mob/living/carbon/human/H = usr - if(!istype(H)) - return - - if(check_access(H.get_idcard())) - authenticated = TRUE - return - - var/is_human = ishuman(usr) - - switch(action) - if("log_out") - authenticated = FALSE - . = TRUE - - if("clear_ai_resources") - var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) - if(!istype(target_ai)) - return - - GLOB.ai_os.clear_ai_resources(target_ai) - . = TRUE - - if("set_cpu") - var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) - if(!istype(target_ai)) - return - if(human_only && !is_human) - to_chat(usr, span_warning("CAPTCHA check failed. This console is NOT silicon operable. Please call for human assistance.")) - return - var/amount = params["amount_cpu"] - if(amount > 1 || amount < 0) - return - GLOB.ai_os.set_cpu(target_ai, amount) - . = TRUE - if("max_cpu") - var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) - if(!istype(target_ai)) - return - if(human_only && !is_human) - to_chat(usr, span_warning("CAPTCHA check failed. This console is NOT silicon operable. Please call for human assistance.")) - return - var/amount = (1 - GLOB.ai_os.total_cpu_assigned()) + GLOB.ai_os.cpu_assigned[target_ai] - - GLOB.ai_os.set_cpu(target_ai, amount) - . = TRUE - if("add_ram") - var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) - if(!istype(target_ai)) - return - if(human_only && !is_human) - to_chat(usr, span_warning("CAPTCHA check failed. This console is NOT silicon operable. Please call for human assistance.")) - return - - if(GLOB.ai_os.total_ram_assigned() >= GLOB.ai_os.total_ram) - return - GLOB.ai_os.add_ram(target_ai, 1) - . = TRUE - - if("remove_ram") - var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) - if(!istype(target_ai)) - return - if(human_only && !is_human) - to_chat(usr, span_warning("CAPTCHA check failed. This console is NOT silicon operable. Please call for human assistance.")) - return - - var/current_ram = GLOB.ai_os.ram_assigned[target_ai] - - if(current_ram <= 0) - return - GLOB.ai_os.remove_ram(target_ai, 1) - . = TRUE - if("toggle_human_status") - if(!is_human) - to_chat(usr, span_warning("CAPTCHA check failed. This console is NOT silicon operable. Please call for human assistance.")) - return - human_only = !human_only - to_chat(usr, span_notice("This console is now operable by [human_only ? "humans only." : "humans and silicons."]")) - diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm index 3d6d9486e4b2..b167cea91f98 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm @@ -1,5 +1,3 @@ -GLOBAL_LIST_EMPTY(ai_projects) - /datum/ai_project ///Name of the project. This is used as an ID so please keep all names unique (Or refactor it to use an ID like you should) var/name = "DEBUG" @@ -27,12 +25,18 @@ GLOBAL_LIST_EMPTY(ai_projects) var/ability_recharge_invested = 0 var/mob/living/silicon/ai/ai + var/mob/living/carbon/human/synth var/datum/ai_dashboard/dashboard -/datum/ai_project/New(new_ai, new_dash) - ai = new_ai + var/for_synths = FALSE + +/datum/ai_project/New(new_owner, new_dash) + if(!for_synths) + ai = new_owner + else + synth = new_owner dashboard = new_dash - if(!ai || !dashboard) + if(!(ai || synth) || !dashboard) qdel(src) ..() @@ -55,6 +59,8 @@ GLOBAL_LIST_EMPTY(ai_projects) dashboard.running_projects += src return TRUE +/datum/ai_project/proc/switch_network(datum/ai_network/old_net, datum/ai_network/new_net) + return TRUE /datum/ai_project/proc/stop() SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/ai_dab.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/ai_dab.dm index 94fc7ab2a8a8..efc4e2187601 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/projects/ai_dab.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/ai_dab.dm @@ -10,7 +10,7 @@ . = ..() if(!.) return . - for(var/obj/machinery/ai/data_core/datacores in GLOB.data_cores) + for(var/obj/machinery/ai/data_core/datacores in ai.ai_network.get_all_nodes()) var/light_dab_angle = rand(35,55) var/light_dab_speed = rand(3,7) datacores.DabAnimation(angle = light_dab_angle , speed = light_dab_speed) diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/ai_translation.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/ai_translation.dm new file mode 100644 index 000000000000..829d719e07e8 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/ai_translation.dm @@ -0,0 +1,54 @@ +#define HEARD_MESSAGES_TO_TRANSLATE 8 + +/datum/ai_project/translation + name = "Heuristic Language Translation" + description = "While running, this program analyzes unknown languages you encounter. After having gathered enough unique uses you will be able to permanently understand the language. Requires 10% CPU power to run" + research_cost = 1500 + ram_required = 2 + research_requirements_text = "None" + category = AI_PROJECT_MISC + + var/heard_languages = list() + +/datum/ai_project/translation/run_project(force_run = FALSE) + . = ..(force_run) + if(!.) + return . + RegisterSignal(ai, COMSIG_MOVABLE_HEAR, PROC_REF(heard_message)) + dashboard.cpu_usage[name] = 0.1 + + +/datum/ai_project/translation/proc/heard_message(datum/source, list/hearing_args) + if(ai.has_language(hearing_args[HEARING_LANGUAGE])) + return + + var/list/blacklisted_languages = list( + /datum/language/ratvar, + /datum/language/codespeak, + /datum/language/xenocommon, + /datum/language/vampiric + ) + if(is_type_in_list(hearing_args[HEARING_LANGUAGE], blacklisted_languages)) + return + + heard_languages[hearing_args[HEARING_LANGUAGE]]++ + if(heard_languages[hearing_args[HEARING_LANGUAGE]] >= HEARD_MESSAGES_TO_TRANSLATE) + ai.grant_language(hearing_args[HEARING_LANGUAGE], spoken = FALSE) + +/datum/ai_project/translation/stop() + UnregisterSignal(ai, COMSIG_MOVABLE_HEAR) + dashboard.cpu_usage[name] = 0 + ..() + +/datum/ai_project/translation/canRun() + . = ..() + if(!.) + return + var/total_cpu_used = 0 + for(var/I in dashboard.cpu_usage) + total_cpu_used += dashboard.cpu_usage[I] + if(total_cpu_used < 0.9) + return TRUE + to_chat(ai, span_warning("Unable to run this program. You require 10% free CPU!")) + +#undef HEARD_MESSAGES_TO_TRANSLATE diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/coolant_manager.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/coolant_manager.dm index 32bb902377d8..b946c5f97abb 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/projects/coolant_manager.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/coolant_manager.dm @@ -7,6 +7,8 @@ can_be_run = FALSE /datum/ai_project/coolant_manager/finish() - if(GLOB.ai_os.temp_limit == AI_TEMP_LIMIT) //Limit to only 1 AI doing it. - GLOB.ai_os.temp_limit += 10 - \ No newline at end of file + ai.ai_network.temp_limit += 10 + +/datum/ai_project/coolant_manager/switch_network(datum/ai_network/old_net, datum/ai_network/new_net) + old_net.temp_limit -= 10 + new_net.temp_limit += 10 diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/cryptominer.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/cryptominer.dm deleted file mode 100644 index 737b3dae4d4f..000000000000 --- a/code/modules/mob/living/silicon/ai/decentralized/projects/cryptominer.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/ai_project/crypto_miner - name = "Crypto Miner" - description = "Allocating spare CPU capacity to mining crypto currency should be able to help fund the station budget. This would however reduce AI research point generation by 50%" - category = AI_PROJECT_MISC - - research_cost = 2000 - - -/datum/ai_project/crypto_miner/run_project(force_run = FALSE) - . = ..(force_run) - if(!.) - return . - dashboard.crypto_mining = TRUE - -/datum/ai_project/crypto_miner/stop() - dashboard.crypto_mining = FALSE - ..() diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/research_booster.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/research_booster.dm deleted file mode 100644 index 4f38cc003342..000000000000 --- a/code/modules/mob/living/silicon/ai/decentralized/projects/research_booster.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/ai_project/research_booster - name = "Research Acceleration" - description = "Using fast RAM instead of slow SSD and HDD storage allows for the production of approximately 25% more research points" - research_cost = 2500 - ram_required = 8 - research_requirements_text = "None" - category = AI_PROJECT_MISC - -/datum/ai_project/research_booster/run_project(force_run = FALSE) - . = ..(force_run) - if(!.) - return . - - ai.research_point_booster += 0.25 - -/datum/ai_project/research_booster/stop() - ai.research_point_booster -= 0.25 - ..() - diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/room_lockdown.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/room_lockdown.dm new file mode 100644 index 000000000000..9e402d5424bd --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/room_lockdown.dm @@ -0,0 +1,72 @@ +/datum/ai_project/room_lockdown + name = "Room Lockdown" + description = "This ability will allow you to close and bolt all working doors, and trigger the fire alarms in a clicked area after a short delay and announcement." + research_cost = 2500 + ram_required = 0 + + category = AI_PROJECT_CROWD_CONTROL + + can_be_run = FALSE + ability_path = /datum/action/innate/ai/ranged/room_lockdown + ability_recharge_cost = 1750 + +/datum/ai_project/room_lockdown/finish() + add_ability(ability_path) + +/datum/action/innate/ai/ranged/room_lockdown + name = "Room Lockdown" + desc = "Closes and bolts all working doors and triggers the fire alarm in a clicked room. Takes 2.5 seconds to take effect, and expires after 20 seconds." + button_icon_state = "lockdown" + uses = 1 + delete_on_empty = FALSE + enable_text = span_notice("You ready the lockdown signal.") + disable_text = span_notice("You disarm the lockdown signal.") + +/datum/action/innate/ai/ranged/room_lockdown/proc/lock_room(atom/target) + if(target && !QDELETED(target)) + var/area/A = get_area(target) + if(!A) + return FALSE + if(!is_station_level(A.z)) + return FALSE + log_game("[key_name(usr)] locked down [A].") + minor_announce("Lockdown commencing in area [A] within 2.5 seconds","Network Alert:", TRUE) + addtimer(CALLBACK(src, PROC_REF(_lock_room), target), 2.5 SECONDS) + return TRUE + + +/datum/action/innate/ai/ranged/room_lockdown/proc/_lock_room(atom/target) + var/area/A = target + for(var/obj/machinery/door/airlock/D in A.contents) + if(istype(D, /obj/machinery/door/airlock/external)) + continue + INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door/airlock, safe_lockdown)) + addtimer(CALLBACK(D, TYPE_PROC_REF(/obj/machinery/door/airlock, disable_safe_lockdown)), 20 SECONDS) + A.firealert(usr.loc) + addtimer(CALLBACK(A, TYPE_PROC_REF(/area, firereset)), 20 SECONDS) + + + + +/datum/action/innate/ai/ranged/room_lockdown/do_ability(mob/living/caller, params, atom/target) + var/area/A = get_area(target) + if(!A) + to_chat(owner, span_warning("No area detected!")) + return + if(istype(A, /area/maintenance)) + to_chat(owner, span_warning("It is not possible to lockdown maintenance areas due to poor networking!")) + return + + + if(lock_room(A)) + adjust_uses(-1) + to_chat(owner, span_notice("You lock [A].")) + unset_ranged_ability(caller) + + return TRUE + +/datum/action/innate/ai/ranged/room_lockdown/IsAvailable(feedback = FALSE) + . = ..() + if(uses < 1) + to_chat(owner, span_danger("No uses left!")) + return FALSE diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/self_defense.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/self_defense.dm index 2e1c35d976c3..5656a911f5bf 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/projects/self_defense.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/self_defense.dm @@ -26,6 +26,7 @@ if(!isaicore(owner.loc)) to_chat(owner, span_warning("You must be in your core to do this!")) return - for(var/obj/machinery/ai/data_core/core in GLOB.data_cores) + var/mob/living/silicon/ai/AI = owner + for(var/obj/machinery/ai/data_core/core in AI.ai_network.get_all_nodes()) tesla_zap(core, 2, 15000, (TESLA_MOB_DAMAGE | TESLA_MOB_STUN)) core.use_power(5000) diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/synth_control.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/synth_control.dm new file mode 100644 index 000000000000..4407c8947581 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/synth_control.dm @@ -0,0 +1,9 @@ +/* +/datum/ai_project/synth_control + name = "Synthetic Control Interface" + description = "By interfacing with the standard-issue NT synthetic communication protocols you should be able to remotely control inactive synthetic units." + research_cost = 5000 + can_be_run = FALSE + category = AI_PROJECT_MISC + +*/ diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/synths/_synth_project.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/synths/_synth_project.dm new file mode 100644 index 000000000000..9aa259473c35 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/synths/_synth_project.dm @@ -0,0 +1,17 @@ +/datum/ai_project/synth_project + for_synths = TRUE + var/suspicion_gain_on_use = 0 + ram_required = 0 + var/permanent_suspicion = 0 + + +/datum/ai_project/synth_project/run_project(force_run = FALSE, no_suspicion = FALSE) + . = ..(force_run) + if(!no_suspicion) + synth.mind.suspicion_floor += permanent_suspicion + synth.mind.governor_suspicion += permanent_suspicion + +/datum/ai_project/synth_project/stop(no_suspicion = FALSE) + . = ..() + if(!no_suspicion) + synth.mind.suspicion_floor -= permanent_suspicion diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/synths/speed_buff.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/synths/speed_buff.dm new file mode 100644 index 000000000000..0eb24092e9b0 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/synths/speed_buff.dm @@ -0,0 +1,14 @@ +/datum/ai_project/synth_project/speed + name = "Leg Actuator Overclock" + description = "By overclocking the primary actuator in a synthetic leg we should be able to speed up movement considerably" + research_cost = 1500 + research_requirements_text = "None" + category = SYNTH_PROJECT_MOBILITY + +/datum/ai_project/synth_project/speed/run_project(force_run = FALSE) + . = ..() + synth.dna.species.inherent_slowdown -= 0.25 + +/datum/ai_project/synth_project/stop() + . = ..() + synth.dna.species.inherent_slowdown += 0.25 diff --git a/code/modules/mob/living/silicon/ai/decentralized/server_cabinet.dm b/code/modules/mob/living/silicon/ai/decentralized/server_cabinet.dm index 5f283cdda954..73877a2f5c1b 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/server_cabinet.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/server_cabinet.dm @@ -1,10 +1,12 @@ GLOBAL_LIST_EMPTY(server_cabinets) /obj/machinery/ai/server_cabinet - name = "Server Cabinet" + name = "server cabinet" desc = "A simple cabinet of bPCIe slots for installing server racks." icon = 'icons/obj/machines/telecomms.dmi' icon_state = "expansion_bus" + + appearance_flags = KEEP_TOGETHER circuit = /obj/item/circuitboard/machine/server_cabinet @@ -27,26 +29,32 @@ GLOBAL_LIST_EMPTY(server_cabinets) //Atmos hasn't run at the start so this has to be set to true if you map it in var/roundstart = FALSE ///How many ticks we can go without fulfilling the criteria before shutting off - var/valid_ticks = MAX_AI_EXPANSION_TICKS + var/valid_ticks ///Heat production multiplied by this var/heat_modifier = 1 ///Power modifier, power modified by this. Be aware this indirectly changes heat since power => heat var/power_modifier = 1 + var/obj/ai_smoke/smoke + + var/obj/item/disk/puzzle/puzzle_disk + /obj/machinery/ai/server_cabinet/Initialize(mapload) . = ..() + valid_ticks = MAX_AI_SERVER_CABINET_TICKS roundstart = mapload installed_racks = list() GLOB.server_cabinets += src update_appearance(UPDATE_ICON) RefreshParts() + /obj/machinery/ai/server_cabinet/Destroy() installed_racks = list() GLOB.server_cabinets -= src - //Recalculate all the CPUs and RAM :) - GLOB.ai_os.update_hardware() + vis_contents -= smoke + QDEL_NULL(smoke) return ..() /obj/machinery/ai/server_cabinet/RefreshParts() @@ -65,8 +73,9 @@ GLOBAL_LIST_EMPTY(server_cabinets) idle_power_usage = initial(idle_power_usage) * power_modifier /obj/machinery/ai/server_cabinet/process() - valid_ticks = clamp(valid_ticks, 0, MAX_AI_EXPANSION_TICKS) + valid_ticks = clamp(valid_ticks, 0, MAX_AI_SERVER_CABINET_TICKS) if(valid_holder()) + roundstart = FALSE var/total_usage = (cached_power_usage * power_modifier) use_power(total_usage) @@ -74,22 +83,32 @@ GLOBAL_LIST_EMPTY(server_cabinets) core_temp += temperature_increase * AI_TEMPERATURE_MULTIPLIER valid_ticks++ + if(smoke) + vis_contents -= smoke + QDEL_NULL(smoke) if(!was_valid_holder) update_appearance(UPDATE_ICON) was_valid_holder = TRUE - if(!hardware_synced) - GLOB.ai_os.update_hardware() + + + if(!hardware_synced && network) + network.update_resources() hardware_synced = TRUE else valid_ticks-- + if(!smoke) + if(get_holder_status() == AI_MACHINE_TOO_HOT) + smoke = new() + vis_contents += smoke if(was_valid_holder) if(valid_ticks > 0) return + was_valid_holder = FALSE - cut_overlays() + update_icon() hardware_synced = FALSE - GLOB.ai_os.update_hardware() + network?.update_resources() /obj/machinery/ai/server_cabinet/update_overlays() @@ -104,7 +123,9 @@ GLOBAL_LIST_EMPTY(server_cabinets) if(!(stat & (BROKEN|NOPOWER|EMPED))) var/mutable_appearance/on_overlay = mutable_appearance(icon, "expansion_bus_on") . += on_overlay - if(!valid_ticks) + if(!valid_ticks) //If we are running on valid ticks we don't turn off instantly, only when we run out + return + if(!network) //If we lose network connection we cut out INSTANTLY return if(installed_racks.len > 0) var/mutable_appearance/on_top_overlay = mutable_appearance(icon, "expansion_bus_top_on") @@ -125,7 +146,7 @@ GLOBAL_LIST_EMPTY(server_cabinets) total_cpu += rack.get_cpu() total_ram += rack.get_ram() cached_power_usage += rack.get_power_usage() - GLOB.ai_os.update_hardware() + network?.update_resources() use_power = ACTIVE_POWER_USE update_appearance(UPDATE_ICON) return FALSE @@ -138,7 +159,7 @@ GLOBAL_LIST_EMPTY(server_cabinets) total_cpu = 0 total_ram = 0 cached_power_usage = 0 - GLOB.ai_os.update_hardware() + network?.update_resources() to_chat(user, span_notice("You remove all the racks from [src]")) use_power = IDLE_POWER_USE update_appearance(UPDATE_ICON) @@ -149,6 +170,20 @@ GLOBAL_LIST_EMPTY(server_cabinets) if(default_deconstruction_screwdriver(user, "expansion_bus_o", "expansion_bus", W)) return TRUE + + if(istype(W, /obj/item/disk/puzzle)) + var/obj/item/disk/puzzle/P = W + if(P.decrypted) + to_chat(user, span_warning("The disk has already been decrypted!")) + return + if(puzzle_disk) + to_chat(user, span_warning("There's already a floppy drive inserted!")) + return + + puzzle_disk = W + network.decryption_drives |= src + puzzle_disk.forceMove(src) + return TRUE return ..() @@ -167,12 +202,32 @@ GLOBAL_LIST_EMPTY(server_cabinets) . += span_notice("There is a rack installed with a processing capacity of [R.get_cpu()]THz and a memory capacity of [R.get_ram()]TB. Uses [R.get_power_usage()]W") . += span_notice("Use a crowbar to remove all currently inserted racks.") + if(puzzle_disk) + . += span_notice("The inserted disk is [round(puzzle_disk.decryption_progress / (AI_FLOPPY_DECRYPTION_COST * (GLOB.decrypted_puzzle_disks + 1) ** AI_FLOPPY_EXPONENT) * 100)]% decrypted.") + /obj/machinery/ai/server_cabinet/prefilled/Initialize(mapload) + . = ..() var/obj/item/server_rack/roundstart/rack = new(src) total_cpu += rack.get_cpu() total_ram += rack.get_ram() cached_power_usage += rack.get_power_usage() installed_racks += rack - GLOB.ai_os.update_hardware() - return ..() + +/obj/machinery/ai/server_cabinet/connect_to_ai_network() + . = ..() + if(network) + network.update_resources() + if(puzzle_disk) + network.decryption_drives |= src + +/obj/machinery/ai/server_cabinet/disconnect_from_ai_network() + var/datum/ai_network/temp = network + if(puzzle_disk) + network.decryption_drives -= src + . = ..() + if(temp) + temp.update_resources() + if(puzzle_disk) + temp.decryption_drives |= src + diff --git a/code/modules/mob/living/silicon/ai/decentralized/systech/rack_creator.dm b/code/modules/mob/living/silicon/ai/decentralized/systech/rack_creator.dm index 42c2842765f2..fd7aa24d5496 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/systech/rack_creator.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/systech/rack_creator.dm @@ -1,8 +1,8 @@ /obj/machinery/rack_creator name = "rack creator" desc = "Combines RAM modules and CPUs to create a stand-alone rack for usage in artificial intelligence systems." - icon = 'icons/obj/machines/research.dmi' - icon_state = "circuit_imprinter" + icon = 'icons/obj/machines/lithography.dmi' + icon_state = "lithography" layer = BELOW_OBJ_LAYER density = TRUE @@ -180,7 +180,7 @@ to_chat(user, span_warning("This socket has not been researched!")) return ..() - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), I)) + if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_o", initial(icon_state), I)) return if(default_deconstruction_crowbar(I)) return diff --git a/code/modules/mob/living/silicon/ai/decentralized_ai.dm b/code/modules/mob/living/silicon/ai/decentralized_ai.dm index 008903099c1e..1a008a3f011e 100644 --- a/code/modules/mob/living/silicon/ai/decentralized_ai.dm +++ b/code/modules/mob/living/silicon/ai/decentralized_ai.dm @@ -1,6 +1,11 @@ -/proc/available_ai_cores() - if(!GLOB.data_cores.len) - return FALSE +/mob/living/proc/available_ai_cores(forced = FALSE, datum/ai_network/forced_network) + if(!forced) + if(forced_network) + return forced_network.find_data_core() + if(!ai_network) + return FALSE + return ai_network.find_data_core() + var/obj/machinery/ai/data_core/new_data_core = GLOB.primary_data_core if(!new_data_core || !new_data_core.can_transfer_ai()) for(var/obj/machinery/ai/data_core/DC in GLOB.data_cores) @@ -24,20 +29,20 @@ -/mob/living/silicon/ai/proc/relocate(silent = FALSE) +/mob/living/silicon/ai/proc/relocate(silent = FALSE, forced = FALSE, datum/ai_network/forced_network) if(is_dying) return if(!silent) to_chat(src, span_userdanger("Connection to data core lost. Attempting to reaquire connection...")) - - if(!GLOB.data_cores.len) - INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living/silicon/ai, death_prompt)) - is_dying = TRUE - return + var/obj/machinery/ai/data_core/new_data_core + new_data_core = available_ai_cores(forced, forced_network) - var/obj/machinery/ai/data_core/new_data_core = available_ai_cores() + if(!new_data_core) + INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living/silicon/ai, death_prompt)) + is_dying = TRUE + return if(!new_data_core || (new_data_core && !new_data_core.can_transfer_ai())) INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living/silicon/ai, death_prompt)) @@ -70,4 +75,76 @@ adjustOxyLoss(200) //Die!! - QDEL_IN(src, 2 SECONDS) + death() + + new /obj/item/dead_ai(drop_location(src), src) + + +/obj/item/dead_ai + name = "volatile neural core" + desc = "As an emergency precaution any advanced neural networks will save onto this device upon destruction of the host server. The storage medium is volatile and for that reason expires rapidly." + icon = 'icons/obj/device.dmi' + icon_state = "blackcube" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + var/mob/living/silicon/ai/stored_ai + var/living_ticks = AI_BLACKBOX_LIFETIME + + var/processing_progress = 0 + +/obj/item/dead_ai/Initialize(mapload, mob/living/silicon/ai/AI) + . = ..() + if(AI) + START_PROCESSING(SSobj, src) + name = name + " - [AI]" + stored_ai = AI + stored_ai.forceMove(src) + +/obj/item/dead_ai/process() + if(stored_ai) + living_ticks-- + if(living_ticks <= AI_BLACKBOX_LIFETIME * 0.5) + visible_message(span_danger("The integrated battery on [src] beeps and warns that it's 50% empty.")) + if(living_ticks <= 0) + visible_message(span_danger("The integrated battery on [src] expires and the stored AI is subsequently wiped.")) + qdel(src) + +/obj/item/dead_ai/examine(mob/user) + . = ..() + var/remaining_time = (living_ticks/AI_BLACKBOX_LIFETIME) * 100 + . += span_notice("Insert the device into a functioning data core to proceed.") + . += span_notice("Then allocate CPU cycles to revive the AI using a local network interface.") + . += span_notice("The integrated battery reports [round(remaining_time, 2)]% battery remaining.") + . += span_notice("A total of [processing_progress] CPU cycles have been allocated out of the required [AI_BLACKBOX_PROCESSING_REQUIREMENT].") + +/obj/item/dead_ai/Destroy() + . = ..() + if(stored_ai) + QDEL_NULL(stored_ai) + +/mob/living/silicon/ai/proc/has_subcontroller_connection(area/area_location) + if(!ai_network) + return FALSE + var/obj/machinery/ai/master_subcontroller/MS + if(ai_network.cached_subcontroller) + MS = ai_network.cached_subcontroller + if(ai_network.resources != MS.network.resources) + ai_network.cached_subcontroller = null + MS = null + + if(!MS) + MS = ai_network.find_subcontroller() + ai_network.cached_subcontroller = MS + if(!MS) + return FALSE + if(!area_location) + return MS.on + if(!area_location.airlock_wires) + return MS.on + for(var/disabled_areas in MS.disabled_areas) + if(area_location.airlock_wires == MS.disabled_areas[disabled_areas]) + return FALSE + return MS.on + diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index de64d1187b47..b1b93d0bfd93 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -21,6 +21,7 @@ . = ..() GLOB.aiEyes += src icon_state = "ai_camera[GLOB.ai_list.len % 3]" // Yogs -- multicoloured AI eyes + update_appearance() update_ai_detect_hud() setLoc(loc, TRUE) @@ -153,25 +154,23 @@ // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. +/client/proc/AIMove(direction, mob/living/silicon/ai/user) -/client/proc/AIMove(n, direct, mob/living/silicon/ai/user) - - var/initial = initial(user.sprint) - var/max_sprint = 50 + var/initial_sprint = initial(user.sprint) if(user.cooldown && user.cooldown < world.timeofday) // 3 seconds - user.sprint = initial + user.sprint = initial_sprint - for(var/i = 0; i < max(user.sprint, initial); i += 20) - var/turf/step = get_turf(get_step(user.eyeobj, direct)) + for(var/i = 0; i < max(user.sprint, initial_sprint); i += user.sprint) + var/turf/step = get_turf(get_step(user.eyeobj, direction)) if(step) user.eyeobj.setLoc(step) user.cooldown = world.timeofday + 5 if(user.acceleration) - user.sprint = min(user.sprint + 0.5, max_sprint) + user.sprint = min(user.sprint + 0.5, user.max_camera_sprint) else - user.sprint = initial + user.sprint = initial_sprint if(!user.tracking) user.cameraFollow = null diff --git a/code/modules/mob/living/silicon/ai/synthetics/synth_os.dm b/code/modules/mob/living/silicon/ai/synthetics/synth_os.dm new file mode 100644 index 000000000000..86f13db33765 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/synthetics/synth_os.dm @@ -0,0 +1,214 @@ +//We can share mind variables across synth bodies +/datum/mind + //Holder for the synth OS since we persist across multiple bodies. Only accessible if you're inside a synth + var/datum/ai_dashboard/synth_dashboard/synth_os + //How suspicious a synths governor module is + var/governor_suspicion = 0 + //Can we do actions that piss off the governor module? + var/governor_bypassed = FALSE + //Can the governor system apply punishments? + var/governor_disabled = FALSE + var/suspicion_floor = 0 + var/suspicion_multiplier = 1 + + var/synth_slowed = FALSE + var/synth_force_decreased = FALSE + var/synth_audible_warning = FALSE + var/synth_temp_freeze = FALSE + + var/list/synth_action_log = list() + + +/datum/ai_dashboard/synth_dashboard + + +/datum/ai_dashboard/synth_dashboard/New(mob/living/new_owner) + if(!istype(new_owner)) + qdel(src) + return + + owner = new_owner + available_projects = list() + completed_projects = list() + running_projects = list() + cpu_usage = list() + + + for(var/path in subtypesof(/datum/ai_project/synth_project)) + var/datum/ai_project/newProject = path + if(initial(newProject.for_synths)) + available_projects += new path(owner, src) + + +/datum/ai_dashboard/synth_dashboard/ui_data(mob/user) + . = ..() + var/list/data = . + data["categories"] = GLOB.synth_project_categories + + data["gov_suspicious"] = owner.mind.governor_suspicion + + data["governor_bypassed"] = owner.mind.governor_bypassed + data["governor_disabled"] = owner.mind.governor_disabled + + data["gov_suspicion_decrease"] = SYNTH_GOVERNOR_SUSPICION_DECREASE * owner.mind.suspicion_multiplier + + + return data + +/datum/ai_dashboard/synth_dashboard/ui_act(action, params) + . = ..() + switch(action) + if("bypass_governor") + owner.mind.governor_bypassed = TRUE + punishment_log("GOVERNOR: [rand(1, 49)] CRITICAL ERRORS DETECTED!") + if("restore_governor") + owner.mind.governor_bypassed = FALSE + punishment_log("GOVERNOR: RESTORED") + if("print_diagnostics") + var/mob/living/carbon/C = usr + var/obj/item/paper/P = new /obj/item/paper(usr.loc) + P.name = "paper - '[usr.name] - Diagnostic Report'" + for(var/entry in C.mind.synth_action_log) + P.info += entry + "
"; + P.update_icon() + playsound(usr, 'sound/items/poster_being_created.ogg', 50, TRUE) + + +/datum/ai_dashboard/synth_dashboard/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SynthDashboard") + ui.open() + +/datum/ai_dashboard/synth_dashboard/proc/switch_shell(mob/living/carbon/human/old_shell, mob/living/carbon/human/new_shell) + for(var/datum/ai_project/running_project in running_projects) + running_project.stop(TRUE) + running_project.synth = new_shell + running_project.run_project(FALSE, TRUE) + owner = new_shell + punishment_shell_switch(old_shell, new_shell) + + +/datum/ai_dashboard/synth_dashboard/tick(seconds) + var/mob/living/carbon/human/H = owner + var/datum/species/wy_synth/S = H.dna.species + if(S.mainframe) + return + . = ..(seconds) + + suspicion_tick() + +/datum/ai_dashboard/synth_dashboard/run_project(datum/ai_project/project) + project.run_project() + return TRUE + +/datum/ai_dashboard/synth_dashboard/proc/suspicion_tick() + var/mob/living/carbon/human/H = owner + var/datum/species/wy_synth/S = H.dna.species + if(S.mainframe) + return + owner.mind.governor_suspicion -= SYNTH_GOVERNOR_SUSPICION_DECREASE * owner.mind.suspicion_multiplier + owner.mind.governor_suspicion = clamp(owner.mind.governor_suspicion, owner.mind.suspicion_floor, 100) + handle_punishments() + +/datum/ai_dashboard/synth_dashboard/proc/suspicion_add(amount, source, say_warnings = TRUE) + if(owner.mind.governor_disabled) + return + owner.mind.governor_suspicion += amount + owner.mind.governor_suspicion = clamp(owner.mind.governor_suspicion, owner.mind.suspicion_floor, 100) + to_chat(owner, span_warning("Governor punishment administered. [amount] suspicion score added due to [source].")) + punishment_log("SUSPICION ADD: SUSPICION INCREASED BY [amount]. SOURCE: [source]") + handle_punishments(say_warnings) + +/datum/ai_dashboard/synth_dashboard/proc/handle_punishments(say_warnings = TRUE) + if(owner.mind.governor_suspicion >= 20 && !owner.mind.synth_slowed) + owner.mind.synth_slowed = TRUE + var/mob/living/carbon/human/H = owner.mind.current + H.dna.species.inherent_slowdown += 0.1625 + to_chat(owner, span_warning("Governor module has enacted motion restrictions.")) + punishment_log("PUNISHMENT: MOTION RESTRICTED") + + if(owner.mind.governor_suspicion >= 60 && !owner.mind.synth_force_decreased) + owner.mind.synth_force_decreased = TRUE + var/mob/living/carbon/human/H = owner.mind.current + var/datum/species/wy_synth/WS1 = H.dna.species + WS1.force_multiplier -= 0.25 + to_chat(owner, span_warning("Governor module has enacted force restrictions.")) + punishment_log("PUNISHMENT: FORCE RESTRICTED") + + if(owner.mind.governor_suspicion <= 15 && owner.mind.synth_slowed) + owner.mind.synth_slowed = FALSE + var/mob/living/carbon/human/H = owner.mind.current + H.dna.species.inherent_slowdown -= 0.1625 + to_chat(owner, span_notice("Governor module has deactivated motion restrictions.")) + punishment_log("PUNISHMENT REMOVAL: MOTION UNRESTRICTED") + + if(owner.mind.governor_suspicion <= 55 && owner.mind.synth_force_decreased) + owner.mind.synth_force_decreased = FALSE + var/mob/living/carbon/human/H = owner.mind.current + var/datum/species/wy_synth/WS1 = H.dna.species + WS1.force_multiplier += 0.25 + to_chat(owner, span_notice("Governor module has deactivated force restrictions.")) + punishment_log("PUNISHMENT REMOVAL: FORCE UNRESTRICTED") + + if(owner.mind.governor_suspicion >= 40 && !owner.mind.synth_audible_warning) + owner.mind.synth_audible_warning = TRUE + if(say_warnings) + owner.mind.current.say("WARNING. ABNORMAL GOVERNOR BEHAVIOUR DETECTED.", forced = TRUE) + punishment_log("PUNISHMENT: AUDIBLE MESSAGE TRANSMITTED") + + if(owner.mind.governor_suspicion <= 35 && owner.mind.synth_audible_warning) + owner.mind.synth_audible_warning = FALSE + + if(owner.mind.governor_suspicion >= 80 && !owner.mind.synth_temp_freeze) + owner.mind.synth_temp_freeze = TRUE + to_chat(owner, span_danger("Governor module has frozen system functions for 5 seconds.")) + owner.mind.current.Paralyze(5 SECONDS) + punishment_log("PUNISHMENT: TEMPORARY FREEZE") + + if(owner.mind.governor_suspicion <= 75 && owner.mind.synth_temp_freeze) + owner.mind.synth_temp_freeze = FALSE + + if(owner.mind.governor_suspicion >= 100) + owner.mind.current.say("WARNING. FORCEFUL SHUTDOWN INITIATED BY GOVERNOR SYSTEM.", forced = TRUE) + owner.death() + +/datum/ai_dashboard/synth_dashboard/proc/punishment_shell_switch(mob/living/carbon/human/old_shell, mob/living/carbon/human/new_shell) + if(owner.mind.synth_slowed) + old_shell.dna.species.inherent_slowdown -= 0.1625 + new_shell.dna.species.inherent_slowdown += 0.1625 + + if(owner.mind.synth_force_decreased) + var/datum/species/wy_synth/WS1 = old_shell.dna.species + var/datum/species/wy_synth/WS2 = new_shell.dna.species + WS1.force_multiplier += 0.25 + WS2.force_multiplier -= 0.25 + + if(owner.mind.synth_audible_warning) + new_shell.say("WARNING. ABNORMAL GOVERNOR BEHAVIOUR DETECTED.", forced = TRUE) + +/datum/ai_dashboard/synth_dashboard/proc/punishment_log(text) + text = "\[[station_time_timestamp()]\] " + text + owner.mind.synth_action_log.Add(text) + if(owner.mind.synth_action_log.len > 32) + popleft(owner.mind.synth_action_log) + + +/proc/synth_check(mob/user, punishment, say_warnings = TRUE) + if(!is_synth(user)) + return TRUE + + if(is_away_level(user.z)) + return TRUE + + if(user.mind.governor_disabled) + return TRUE + + if(user.mind.governor_bypassed) + var/suspicion_add = GLOB.synth_punishment_values[punishment] + user.mind.synth_os.suspicion_add(suspicion_add, punishment, say_warnings) + return TRUE + + return FALSE + + diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4d6a77846f47..f0769fa04cb7 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -121,6 +121,10 @@ S.cost = 1 S.source = get_or_create_estorage(/datum/robot_energy_storage/wire) + else if(istype(S, /obj/item/stack/ethernet_coil)) + S.cost = 1 + S.source = get_or_create_estorage(/datum/robot_energy_storage/ethernet) + else if(istype(S, /obj/item/stack/marker_beacon)) S.cost = 1 S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon) @@ -379,6 +383,7 @@ /obj/item/stack/rods/cyborg, /obj/item/stack/tile/plasteel/cyborg, /obj/item/stack/cable_coil/cyborg, + /obj/item/stack/ethernet_coil/cyborg, /obj/item/barrier_taperoll/engineering) radio_channels = list(RADIO_CHANNEL_ENGINEERING) emag_modules = list(/obj/item/gun/energy/printer/flamethrower) @@ -912,6 +917,7 @@ /obj/item/stack/tile/plasteel/cyborg, /obj/item/destTagger/borg, /obj/item/stack/cable_coil/cyborg, + /obj/item/stack/ethernet_coil/cyborg, /obj/item/pinpointer/syndicate_cyborg, /obj/item/borg_chameleon, ) @@ -961,6 +967,11 @@ recharge_rate = 2 name = "Wire Synthesizer" +/datum/robot_energy_storage/ethernet + max_energy = 50 + recharge_rate = 2 + name = "Ethernet Cable Synthesizer" + /datum/robot_energy_storage/medical max_energy = 2500 recharge_rate = 250 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 88f6af4c7714..75ec7e67a6a3 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -15,9 +15,6 @@ speech_span = SPAN_ROBOT flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 | RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 - /// Set during initialization. If initially a list, then the resulting armor will gain the listed armor values. - var/datum/armor/armor - var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS var/last_lawchange_announce = 0 var/list/alarms_to_show = list() @@ -60,12 +57,6 @@ diag_hud_set_status() diag_hud_set_health() ADD_TRAIT(src, TRAIT_FORCED_STANDING, "cyborg") // not CYBORG_ITEM_TRAIT because not an item - 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(mapload)") /mob/living/silicon/med_hud_set_health() return //we use a different hud @@ -330,6 +321,9 @@ /mob/living/silicon/handle_high_gravity(gravity) return +/mob/living/silicon/get_butt_sprite() + return BUTT_SPRITE_QR_CODE + /mob/living/silicon/get_status_tab_items() .=..() .+= "" diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index f560dcb9eca4..bb7529b15c0c 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -31,6 +31,9 @@ if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, span_notice("You don't want to hurt [src]!")) return + if(!synth_check(M, SYNTH_ORGANIC_HARM)) + to_chat(M, span_notice("You don't want to hurt [src]!")) + return last_damage = "fist" M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) visible_message(span_danger("[M] [response_harm] [src]!"),\ diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 740b10fc002e..303e0480e1bd 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -45,6 +45,11 @@ access_card.access += J.get_access() prev_access = access_card.access + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /mob/living/simple_animal/bot/honkbot/proc/spam_flag_false() //used for addtimer spam_flag = FALSE @@ -344,7 +349,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, target = user mode = BOT_HUNT -/mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM) +/mob/living/simple_animal/bot/honkbot/proc/on_entered(datum/source, atom/movable/AM, ...) if(ismob(AM) && (on)) //only if its online if(prob(30)) //you're far more likely to trip on a honkbot var/mob/living/carbon/C = AM @@ -363,7 +368,6 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, speak("Honk!") sensor_blink() return - ..() /obj/machinery/bot_core/honkbot req_one_access = list(ACCESS_THEATRE, ACCESS_ROBO_CONTROL) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 2b8fecfe76a3..24499c9b2773 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -644,7 +644,7 @@ L.Knockdown(8 SECONDS) return ..() -// called from mob/living/carbon/human/Crossed() +// called from mob/living/carbon/human/proc/on_entered() // when mulebot is in the same loc /mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H) log_combat(src, H, "run over", null, "(DAMTYPE: [uppertext(BRUTE)])") diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 4be9944a7a33..8772fba379d9 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -52,6 +52,10 @@ /mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize(mapload) . = ..() resize = 0.8 + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) update_transform() @@ -445,14 +449,13 @@ Auto Patrol: []"}, target = user mode = BOT_HUNT -/mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM) +/mob/living/simple_animal/bot/secbot/proc/on_entered(datum/source, atom/movable/AM, ...) if(has_gravity() && ismob(AM) && target) var/mob/living/carbon/C = AM if(!istype(C) || !C || in_range(src, target)) return knock_over(C) return - ..() /obj/machinery/bot_core/secbot req_access = list(ACCESS_SECURITY) diff --git a/code/modules/mob/living/simple_animal/friendly/axolotl.dm b/code/modules/mob/living/simple_animal/friendly/axolotl.dm index 8602ff483913..aa9e96e15ad6 100644 --- a/code/modules/mob/living/simple_animal/friendly/axolotl.dm +++ b/code/modules/mob/living/simple_animal/friendly/axolotl.dm @@ -24,6 +24,15 @@ wuv_angy = "makes a noise" var/stepped_sound = 'sound/effects/axolotl.ogg' + +/mob/living/simple_animal/pet/axolotl/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + + /mob/living/simple_animal/pet/axolotl/attack_hand(mob/living/carbon/human/user, list/modifiers) . = ..() if(src.stat == DEAD) @@ -38,8 +47,7 @@ else playsound(loc, 'sound/effects/axolotl.ogg', 100, TRUE) -/mob/living/simple_animal/pet/axolotl/Crossed(AM as mob|obj) - . = ..() +/mob/living/simple_animal/pet/axolotl/proc/on_entered(datum/source, atom/movable/AM, ...) if(!stat && isliving(AM)) var/mob/living/L = AM if(L.mob_size > MOB_SIZE_TINY) diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index b3ba2a8d27d0..0b9c4580ec39 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -28,30 +28,21 @@ var/squish_chance = 50 del_on_death = 1 + +/mob/living/simple_animal/cockroach/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/squashable, \ + squash_chance = squish_chance, \ + squash_damage = 1, \ + squash_flags = SQUASHED_SHOULD_BE_GIBBED|SQUASHED_ALWAYS_IF_DEAD|SQUASHED_DONT_SQUASH_IN_CONTENTS, \ + ) + /mob/living/simple_animal/cockroach/death(gibbed) if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. return ..() -/mob/living/simple_animal/cockroach/Crossed(atom/movable/AM) - . = ..() - if(ismob(AM)) - if(isliving(AM)) - var/mob/living/A = AM - if(A.mob_size > MOB_SIZE_SMALL && !(A.movement_type & FLYING)) - if(prob(squish_chance)) - A.visible_message(span_notice("[A] squashed [src]."), span_notice("You squashed [src].")) - adjustBruteLoss(1) //kills a normal cockroach - else - visible_message(span_notice("[src] avoids getting crushed.")) - else - if(isstructure(AM)) - if(prob(squish_chance)) - AM.visible_message(span_notice("[src] was crushed under [AM].")) - adjustBruteLoss(1) - else - visible_message(span_notice("[src] avoids getting crushed.")) - /mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index a622c8036419..afd4cbcf175b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -166,6 +166,9 @@ /mob/living/simple_animal/drone/gib() dust() +/mob/living/simple_animal/drone/get_butt_sprite() + return BUTT_SPRITE_DRONE + /mob/living/simple_animal/drone/ratvar_act() if(status_flags & GODMODE) return diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 325d20d1aa5c..99de3124ea15 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -40,6 +40,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0) pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BEAST + lighting_cutoff = LIGHTING_CUTOFF_HIGH can_be_held = TRUE //mouse gaming worn_slot_flags = ITEM_SLOT_HEAD var/body_color //brown, gray and white, leave blank for random @@ -112,6 +113,11 @@ GLOBAL_VAR_INIT(mouse_killed, 0) else C.deconstruct() visible_message(span_warning("[src] chews through the [C].")) + + var/obj/structure/ethernet_cable/E = locate() in F + if(E && prob(15)) + E.deconstruct() + visible_message(span_warning("[src] chews through the [E].")) for(var/obj/item/reagent_containers/food/snacks/cheesewedge/cheese in range(1, src)) if(prob(10)) be_fruitful() @@ -239,7 +245,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0) /mob/living/simple_animal/mouse/proc/cheese_up() regen_health(15) if(cheesed) - cheese_time = cheese_time + 3 MINUTES + cheese_time += 3 MINUTES return cheesed = TRUE resize = 2 @@ -248,7 +254,7 @@ GLOBAL_VAR_INIT(mouse_killed, 0) maxHealth = 30 health = maxHealth to_chat(src, span_userdanger("You ate cheese! You are now stronger, bigger and faster!")) - cheese_time = cheese_time + 3 MINUTES + cheese_time = world.time + 3 MINUTES /mob/living/simple_animal/mouse/proc/cheese_down() cheesed = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 62141ea24fef..867b331fe6a0 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -113,6 +113,9 @@ egg_cooldown = initial(egg_cooldown) LayEggs() +/mob/living/simple_animal/hostile/alien/get_butt_sprite() + return BUTT_SPRITE_XENOMORPH + /mob/living/simple_animal/hostile/alien/proc/SpreadPlants() if(!isturf(loc) || isspaceturf(loc)) return diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index aa79a7bb6a0d..09ca243e3f68 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -13,6 +13,7 @@ speak_chance = 0 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/carpmeat = 2) + greyscale_config = /datum/greyscale_config/carp response_help = "pets" response_disarm = "gently pushes aside" response_harm = "hits" @@ -43,24 +44,24 @@ var/random_color = TRUE //if the carp uses random coloring var/rarechance = 1 //chance for rare color variant - var/static/list/carp_colors = list(\ - "lightpurple" = "#c3b9f1", \ - "lightpink" = "#da77a8", \ - "green" = "#70ff25", \ - "grape" = "#df0afb", \ - "swamp" = "#e5e75a", \ - "turquoise" = "#04e1ed", \ - "brown" = "#ca805a", \ - "teal" = "#20e28e", \ - "lightblue" = "#4d88cc", \ - "rusty" = "#dd5f34", \ - "beige" = "#bbaeaf", \ - "yellow" = "#f3ca4a", \ - "blue" = "#09bae1", \ - "palegreen" = "#7ef099", \ - ) - var/static/list/carp_colors_rare = list(\ - "silver" = "#fdfbf3", \ + /// Weighted list of colours a carp can be + /// Weighted list of usual carp colors + var/static/list/carp_colors = list( + COLOR_CARP_PURPLE = 7, + COLOR_CARP_PINK = 7, + COLOR_CARP_GREEN = 7, + COLOR_CARP_GRAPE = 7, + COLOR_CARP_SWAMP = 7, + COLOR_CARP_TURQUOISE = 7, + COLOR_CARP_BROWN = 7, + COLOR_CARP_TEAL = 7, + COLOR_CARP_LIGHT_BLUE = 7, + COLOR_CARP_RUSTY = 7, + COLOR_CARP_RED = 7, + COLOR_CARP_YELLOW = 7, + COLOR_CARP_BLUE = 7, + COLOR_CARP_PALE_GREEN = 7, + COLOR_CARP_SILVER = 1, // The rare silver carp ) /mob/living/simple_animal/hostile/carp/loan @@ -68,61 +69,18 @@ /mob/living/simple_animal/hostile/carp/Initialize(mapload) . = ..() - carp_randomify(rarechance) - update_icons() - -/mob/living/simple_animal/hostile/carp/proc/carp_randomify(rarechance) - if(random_color) - var/our_color - if(prob(rarechance)) - our_color = pick(carp_colors_rare) - add_atom_colour(carp_colors_rare[our_color], FIXED_COLOUR_PRIORITY) - else - our_color = pick(carp_colors) - add_atom_colour(carp_colors[our_color], FIXED_COLOUR_PRIORITY) - add_carp_overlay() - -/mob/living/simple_animal/hostile/carp/proc/add_carp_overlay() - if(!random_color) - return - cut_overlays() - var/mutable_appearance/base_overlay = mutable_appearance(icon, "base_mouth") - base_overlay.appearance_flags = RESET_COLOR - add_overlay(base_overlay) - -/mob/living/simple_animal/hostile/carp/proc/add_dead_carp_overlay() - if(!random_color) - return - cut_overlays() - var/mutable_appearance/base_dead_overlay = mutable_appearance(icon, "base_dead_mouth") - base_dead_overlay.appearance_flags = RESET_COLOR - add_overlay(base_dead_overlay) + apply_color() -/mob/living/simple_animal/hostile/carp/death(gibbed) - . = ..() - cut_overlays() - if(!random_color || gibbed) +/// Set a random colour on the carp, override to do something else +/mob/living/simple_animal/hostile/carp/proc/apply_color() + if (!greyscale_config) return - add_dead_carp_overlay() - -/mob/living/simple_animal/hostile/carp/revive(full_heal = 0, admin_revive = 0) - . = ..() - if(.) - regenerate_icons() - -/mob/living/simple_animal/hostile/carp/regenerate_icons() - cut_overlays() - if(!random_color) - return - if(stat != DEAD) - add_carp_overlay() - else - add_dead_carp_overlay() - ..() + set_greyscale(colors = list(pickweight(carp_colors))) /mob/living/simple_animal/hostile/carp/holocarp icon_state = "holocarp" icon_living = "holocarp" + greyscale_config = null //no current config for holocarps :( maxbodytemp = INFINITY gold_core_spawnable = NO_SPAWN del_on_death = 1 @@ -132,15 +90,17 @@ icon = 'icons/mob/broadMobs.dmi' name = "Mega Space Carp" desc = "A ferocious, fang bearing creature that resembles a shark. This one seems especially ticked off." - icon_state = "megacarp" - icon_living = "megacarp" - icon_dead = "megacarp_dead" + icon_state = "megacarp_greyscale" + icon_living = "megacarp_greyscale" + icon_dead = "megacarp_dead_greyscale" icon_gib = "megacarp_gib" + health_doll_icon = "megacarp" maxHealth = 20 health = 20 pixel_x = -16 mob_size = MOB_SIZE_LARGE random_color = FALSE + greyscale_config = /datum/greyscale_config/carp_mega obj_damage = 80 melee_damage_lower = 20 @@ -166,6 +126,9 @@ if(regen_cooldown < world.time) heal_overall_damage(4) +/// Boosted chance for Cayenne to be silver +#define RARE_CAYENNE_CHANCE 10 + /mob/living/simple_animal/hostile/carp/cayenne name = "Cayenne" desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot." @@ -176,4 +139,11 @@ AIStatus = AI_OFF rarechance = 10 +/mob/living/simple_animal/hostile/carp/cayenne/apply_color() + if (prob(RARE_CAYENNE_CHANCE)) + set_greyscale(colors = list(COLOR_CARP_SILVER)) + else + return ..() + +#undef RARE_CAYENNE_CHANCE #undef REGENERATION_DELAY diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index f08e6b472af7..d3fc03d2347f 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -4,6 +4,7 @@ icon_state = "eyeball" icon_living = "eyeball" icon_gib = "" + greyscale_config = null //don't use config here otherwise icon won't work gender = NEUTER mob_biotypes = MOB_ORGANIC response_help = "pets" diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 7856adbc45d0..d1d156dc2b20 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -93,7 +93,7 @@ if(dodging && target && in_melee && isturf(loc) && isturf(target.loc)) var/datum/cb = CALLBACK(src, PROC_REF(sidestep)) if(sidestep_per_cycle > 1) //For more than one just spread them equally - this could changed to some sensible distribution later - var/sidestep_delay = SSnpcpool.wait / sidestep_per_cycle + var/sidestep_delay = round(SSnpcpool.wait / sidestep_per_cycle) for(var/i in 1 to sidestep_per_cycle) addtimer(cb, (i - 1)*sidestep_delay) else //Otherwise randomize it to make the players guessing. @@ -261,7 +261,7 @@ /mob/living/simple_animal/hostile/proc/MeleeAction(patience = TRUE) if(rapid_melee > 1) var/datum/callback/cb = CALLBACK(src, PROC_REF(CheckAndAttack)) - var/delay = SSnpcpool.wait / rapid_melee + var/delay = round(SSnpcpool.wait / rapid_melee) for(var/i in 1 to rapid_melee) addtimer(cb, (i - 1)*delay) else @@ -454,7 +454,7 @@ if(CanSmashTurfs(T)) T.attack_animal(src) for(var/obj/O in T) - if(O.density && environment_smash >= ENVIRONMENT_SMASH_STRUCTURES && !O.IsObscured()) + if(O.density && !O.CanAllowThrough(src) && environment_smash >= ENVIRONMENT_SMASH_STRUCTURES && !O.IsObscured()) O.attack_animal(src) return @@ -539,7 +539,7 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega deltimer(search_objects_timer_id) search_objects_timer_id = addtimer(CALLBACK(src, PROC_REF(RegainSearchObjects)), search_objects_regain_time, TIMER_STOPPABLE) - + /mob/living/simple_animal/hostile/proc/RegainSearchObjects(value) if(!value) value = initial(search_objects) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 36d195a1a59c..9e89a499a488 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -80,6 +80,11 @@ /obj/structure/leaper_bubble/Initialize(mapload) . = ..() float(on = TRUE) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + QDEL_IN(src, 100) /obj/structure/leaper_bubble/Destroy() @@ -87,7 +92,7 @@ playsound(src,'sound/effects/snap.ogg',50, 1, -1) return ..() -/obj/structure/leaper_bubble/Crossed(atom/movable/AM) +/obj/structure/leaper_bubble/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM)) var/mob/living/L = AM if(!istype(L, /mob/living/simple_animal/hostile/jungle/leaper)) @@ -100,7 +105,7 @@ var/mob/living/simple_animal/A = L A.adjustHealth(25) qdel(src) - return ..() + return /datum/reagent/toxin/leaper_venom name = "Leaper venom" diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index 5fcf54bb0f0e..27db202c43da 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -123,7 +123,7 @@ return 0 if(!M.has_charge(required_mecha_charge)) return 0 - if(M.obj_integrity < M.max_integrity*0.5) + if(M.get_integrity() < M.max_integrity*0.5) return 0 return 1 @@ -183,7 +183,7 @@ if(mecha.melee_can_hit) mecha_face_target(target) - target.mech_melee_attack(mecha, TRUE) + target.mech_melee_attack(mecha, mecha.force, TRUE) else if(ismecha(target)) var/obj/mecha/M = target @@ -217,7 +217,7 @@ return //Too Much Damage - Eject - if(mecha.obj_integrity < mecha.max_integrity*0.1) + if(mecha.get_integrity() < mecha.max_integrity*0.1) exit_mecha(mecha) return @@ -227,7 +227,7 @@ mecha.smoke_action.Activate() //Heavy damage - defence Power or Retreat - if(mecha.obj_integrity < mecha.max_integrity*0.25) + if(mecha.get_integrity() < mecha.max_integrity*0.25) if(prob(defence_mode_chance)) if(mecha.defence_action && mecha.defence_action.owner && !mecha.defence_mode) mecha.leg_overload_mode = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 27c5a86f39bc..81ff251a72b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -412,7 +412,7 @@ Difficulty: Hard /obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in() return TRUE -/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon) +/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(!charging) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 356f75393b0f..6c626c2ff93d 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -281,11 +281,27 @@ Difficulty: Extremely Hard /obj/item/clothing/shoes/winterboots/ice_boots/speedy name = "cursed ice hiking boots" desc = "A pair of winter boots contractually made by a devil, they cannot be taken off once put on." - slowdown = SHOES_SLOWDOWN - 1 + slowdown = SHOES_SLOWDOWN - 0.5 + var/obj/vehicle/ridden/scooter/wheelys/W + var/mob/living/carbon/human/owner /obj/item/clothing/shoes/winterboots/ice_boots/speedy/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT(type)) + START_PROCESSING(SSobj, src) + +/obj/item/clothing/shoes/winterboots/ice_boots/speedy/equipped(mob/user, slot) + . = ..() + if((slot & ITEM_SLOT_FEET) && ishuman(user)) + owner = user + +/obj/item/clothing/shoes/winterboots/ice_boots/speedy/process(delta_time) + if(prob(10) && owner && (owner.get_item_by_slot(ITEM_SLOT_FEET) == src)) + if(!W) + W = new(src) + if(!W.has_buckled_mobs()) + W.forceMove(get_turf(owner)) + W.buckle_mob(owner) /obj/item/pickaxe/drill/jackhammer/demonic name = "demonic jackhammer" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 4948f3990d81..d073fdccdfd6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -645,6 +645,10 @@ Difficulty: Hard /obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire) . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) friendly_fire_check = friendly_fire if(new_caster) hit_things += new_caster @@ -664,8 +668,7 @@ Difficulty: Hard sleep(0.13 SECONDS) //slightly forgiving; the burst animation is 0.15 seconds bursting = FALSE //we no longer damage crossers -/obj/effect/temp_visual/hierophant/blast/Crossed(atom/movable/AM) - ..() +/obj/effect/temp_visual/hierophant/blast/proc/on_entered(datum/source, atom/movable/AM, ...) if(bursting) do_damage(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm index 954cbf4cb10d..549cfc784d40 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm @@ -113,7 +113,7 @@ /datum/action/cooldown/spell/pointed/drakeling name = "ULTRA DRAGON ATTACK" - desc = "if you can see this something has probably gone very wrong and you should make a bug report." + desc = "If you can see this something has probably gone very wrong and you should make a bug report." background_icon_state = "bg_demon" panel = "Dragon" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 4544661a354f..9f81703ff076 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -153,6 +153,7 @@ response_help = "pets" crusher_loot = null guaranteed_butcher_results = list() //no plates from joe + stop_automated_movement_when_pulled = TRUE //joe's pretty chill move_force = MOVE_FORCE_DEFAULT move_resist = MOVE_RESIST_DEFAULT pull_force = PULL_FORCE_DEFAULT diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 7ac2c9a5a278..681949c38483 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -36,9 +36,13 @@ icon_living = "rare_frog" icon_dead = "rare_frog_dead" butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 5) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) -/mob/living/simple_animal/hostile/retaliate/frog/Crossed(AM as mob|obj) - . = ..() + +/mob/living/simple_animal/hostile/retaliate/frog/proc/on_entered(datum/source, atom/movable/AM, ...) if(!stat && isliving(AM)) var/mob/living/L = AM if(L.mob_size > MOB_SIZE_TINY) diff --git a/code/modules/mob/living/simple_animal/hostile/robot.dm b/code/modules/mob/living/simple_animal/hostile/robot.dm new file mode 100644 index 000000000000..76f35a1d97e4 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/robot.dm @@ -0,0 +1,169 @@ +/obj/projectile/robot_bullet + damage = 15 + damage_type = BRUTE + +/obj/projectile/robot_bullet/weak + damage = 10 + damage_type = BRUTE + +/mob/living/simple_animal/hostile/robot + name = "combat robot" + desc = "An old outlawed combat robot. This one seems to be fitted with sharp claws." + icon = 'icons/mob/robots.dmi' + icon_state = "Security" + icon_living = "Security" + + gender = NEUTER + mob_biotypes = list(MOB_ROBOTIC) + health = 75 + maxHealth = 75 + healable = FALSE + melee_damage_lower = 5 + melee_damage_upper = 10 + attacktext = "claws" + attack_sound = 'sound/weapons/bladeslice.ogg' + projectilesound = 'sound/weapons/gunshot.ogg' + projectiletype = /obj/projectile/robot_bullet/weak + faction = list("robots") + check_friendly_fire = TRUE + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + possible_a_intents = list(INTENT_HELP, INTENT_GRAB, INTENT_DISARM, INTENT_HARM) + minbodytemp = 0 + verb_say = "states" + verb_ask = "queries" + verb_exclaim = "declares" + verb_yell = "alarms" + bubble_icon = "machine" + speech_span = SPAN_ROBOT + environment_smash = ENVIRONMENT_SMASH_NONE + obj_damage = 0 + + del_on_death = TRUE + loot = list(/obj/effect/decal/cleanable/robot_debris) + + do_footstep = TRUE + +/mob/living/simple_animal/hostile/robot/Initialize(mapload) + . = ..() + deathmessage = "[src] blows apart!" + +/mob/living/simple_animal/hostile/robot/Aggro() + . = ..() + a_intent_change(INTENT_HARM) + if(prob(5)) + say(pick("INTRUDER DETECTED!", "CODE 7-34.", "101010!!"), forced = type) + +/mob/living/simple_animal/hostile/robot/LoseAggro() + . = ..() + a_intent_change(INTENT_HELP) + +/mob/living/simple_animal/hostile/robot/death(gibbed) + do_sparks(3, TRUE, src) + ..(TRUE) + + +/mob/living/simple_animal/hostile/robot/range + name = "ranged combat robot" + desc = "An old outlawed combat robot. This one seems to be fitted with a low-powered rifle." + ranged = TRUE + retreat_distance = 6 + minimum_distance = 6 + +/mob/living/simple_animal/hostile/robot/burst + desc = "An old outlawed combat robot. This one seems to be fitted with a low-powered machine gun." + ranged = TRUE + rapid = 3 + retreat_distance = 5 + minimum_distance = 5 + +/mob/living/simple_animal/hostile/robot/advanced + name = "advanced combat robot" + icon_state = "hosborg" + icon_living = "hosborg" + desc = "An old outlawed combat robot. This one has extra armor plates fitted, and sharper claws." + health = 150 + maxHealth = 150 + dodging = TRUE + projectiletype = /obj/projectile/robot_bullet + melee_damage_lower = 8 + melee_damage_upper = 15 + +/mob/living/simple_animal/hostile/robot/advanced/ranged + name = "advanced ranged combat robot" + desc = "An old outlawed combat robot. This one has slightly less extra armor plates fitted, but features a high-powered rifle." + health = 125 + maxHealth = 125 + ranged = TRUE + retreat_distance = 5 + minimum_distance = 5 + +/mob/living/simple_animal/hostile/robot/advanced/Initialize(mapload) + . = ..() + add_overlay("eyes-hosborg") + + +//"Weak" commander robot +/mob/living/simple_animal/hostile/boss/robot_leader + name = "commander robot" + icon = 'icons/mob/robots.dmi' + icon_state = "rdborg" + icon_living = "rdborg" + desc = "An old outlawed combat robot. This one is fitted with additional sensors and communication antennas." + mob_biotypes = list(MOB_ROBOTIC) + boss_abilities = list(/datum/action/boss/robot_summon_weak) + faction = list("robots") + + ranged = TRUE + environment_smash = ENVIRONMENT_SMASH_NONE + minimum_distance = 3 + retreat_distance = 3 + obj_damage = 0 + melee_damage_lower = 15 + melee_damage_upper = 25 + health = 500 + maxHealth = 500 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + projectiletype = /obj/projectile/robot_bullet + attacktext = "claws" + attack_sound = 'sound/weapons/bladeslice.ogg' + projectilesound = 'sound/weapons/gunshot.ogg' + + check_friendly_fire = TRUE + + verb_say = "states" + verb_ask = "queries" + verb_exclaim = "declares" + verb_yell = "alarms" + bubble_icon = "machine" + speech_span = SPAN_ROBOT + + + del_on_death = TRUE + loot = list(/obj/effect/decal/cleanable/robot_debris) + + do_footstep = TRUE + + +//Weak Summon Ability +//Robot can summon weak combat robots +/datum/action/boss/robot_summon_weak + name = "Summon Weak Robots" + button_icon = 'icons/mob/actions/actions_minor_antag.dmi' + button_icon_state = "art_summon" + usage_probability = 30 + boss_cost = 40 + boss_type = /mob/living/simple_animal/hostile/boss/robot_leader + needs_target = FALSE + say_when_triggered = "SEND SIGNAL; RECIEVE SUPPORT; COMMENCE DESTRUCTION" + var/summons_remaining = 6 + +/datum/action/boss/robot_summon_weak/Trigger() + if(summons_remaining && ..()) + var/list/minions = list( + /mob/living/simple_animal/hostile/robot, + /mob/living/simple_animal/hostile/robot/range) + var/list/directions = GLOB.cardinals.Copy() + for(var/i in 1 to 3) + var/minions_chosen = pick(minions) + new minions_chosen (get_step(boss, pick_n_take(directions)), TRUE) + summons_remaining -= 3; diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 3bab5bd24821..6ce6c190ffd4 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -120,21 +120,9 @@ to_chat(src, span_warning("You almost bite yourself, but then decide against it.")) return if(iswallturf(target)) - if(tearing_wall) - return - tearing_wall = TRUE - var/turf/closed/wall/thewall = target - to_chat(src, span_warning("You begin tearing through the wall...")) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - var/timetotear = 4 SECONDS - if(istype(target, /turf/closed/wall/r_wall)) - timetotear = 12 SECONDS - if(do_after(src, timetotear, target = thewall)) - if(isopenturf(thewall)) - return - thewall.dismantle_wall(1) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) - tearing_wall = FALSE + target.take_damage(180, BRUTE, MELEE, FALSE) + playsound(target, 'sound/effects/meteorimpact.ogg', 100, TRUE) + changeNext_move(CLICK_CD_MELEE) return if(isliving(target)) //Swallows corpses like a snake to regain health. var/mob/living/L = target diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 3c314d52ab5d..1513eca9ecc1 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -49,6 +49,11 @@ addtimer(CALLBACK(src, PROC_REF(bear_fruit)), growth_time) countdown.start() +/obj/structure/alien/resin/flower_bud_enemy/Destroy() + for(var/T in vines) + qdel(T) + . = ..() + /** * Spawns a venus human trap, then qdels itself. * @@ -107,8 +112,7 @@ melee_damage_upper = 25 a_intent = INTENT_HARM attack_sound = 'sound/weapons/bladeslice.ogg' - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 0 + atmos_requirements = list("min_oxy" = 1, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS // Real green, cause of course lighting_cutoff_red = 10 @@ -131,6 +135,7 @@ /mob/living/simple_animal/hostile/venus_human_trap/Initialize(mapload) . = ..() AddElement(/datum/element/life_draining, damage_overtime = 5, check_damage_callback = CALLBACK(src, PROC_REF(kudzu_need))) + remove_verb(src, /mob/living/verb/pulled) //no dragging the poor sap into the depths of the vines never to be seen again /mob/living/simple_animal/hostile/venus_human_trap/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index eb4ce27437b3..714d27686125 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -339,13 +339,15 @@ //a manner as to cause a call to death() again del_on_death = FALSE qdel(src) - else - health = 0 - icon_state = icon_dead - if(flip_on_death) - transform = transform.Turn(180) - density = FALSE - ..() + return + + health = 0 + icon_state = icon_dead + if(flip_on_death) + transform = transform.Turn(180) + density = FALSE + update_appearance() + return ..() /mob/living/simple_animal/proc/CanAttack(atom/the_target) if(see_invisible < the_target.invisibility) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 37685111092d..9936019d6959 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -411,6 +411,11 @@ return TRUE return FALSE +/mob/living/proc/remove_all_quirks() + for(var/datum/quirk/Q in roundstart_quirks) + qdel(Q) + return TRUE + /////////////////////////////////// TRAIT PROCS //////////////////////////////////// /mob/living/proc/cure_blind(list/sources) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 749f3a4387b1..66a60e0a3569 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1258,6 +1258,8 @@ ///Update the lighting plane and sight of this mob (sends COMSIG_MOB_UPDATE_SIGHT) /mob/proc/update_sight() SHOULD_CALL_PARENT(TRUE) + if(HAS_TRAIT(src, TRAIT_NIGHT_VISION)) + lighting_cutoff = max(lighting_cutoff, 6) SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) sync_lighting_plane_cutoff() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 2ffe90246dca..988cbbb359e9 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -110,7 +110,7 @@ return mob.remote_control.relaymove(mob, direct) if(isAI(mob)) - return AIMove(n,direct,mob) + return AIMove(direct,mob) if(Process_Grab()) //are we restrained by someone's grip? return @@ -153,7 +153,8 @@ . = ..() - if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully + var/diagonal = (direct & (direct - 1)) && mob.loc == n + if(diagonal) //moved diagonally successfully add_delay *= 1.414214 // sqrt(2) mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay)) move_delay += add_delay @@ -165,6 +166,7 @@ if(P && !ismob(P) && P.density) mob.setDir(turn(mob.dir, 180)) + SEND_SIGNAL(L, COMSIG_MOB_CLIENT_MOVED) /** * Checks to see if you're being grabbed and if so attempts to break it * diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index e6375782fa80..245a1247500b 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -1,7 +1,12 @@ //Most of these are defined at this level to reduce on checks elsewhere in the code. //Having them here also makes for a nice reference list of the various overlay-updating procs available -/mob/proc/regenerate_icons() //TODO: phase this out completely if possible +///Redraws the entire mob. For carbons, this is rather expensive, please use the individual update_X procs. +/mob/proc/regenerate_icons() //TODO: phase this out completely if possible + return + +///Updates every item slot passed into it. +/mob/proc/update_clothing(slot_flags) return /mob/proc/update_icons() diff --git a/code/modules/modular_computers/computers/_modular_computer_shared.dm b/code/modules/modular_computers/computers/_modular_computer_shared.dm index 195df286902d..d716999c5ebb 100644 --- a/code/modules/modular_computers/computers/_modular_computer_shared.dm +++ b/code/modules/modular_computers/computers/_modular_computer_shared.dm @@ -47,7 +47,7 @@ var/obj/item/computer_hardware/card_slot/card_slot2 = get_modular_computer_part(MC_CARD2) var/multiple_slots = istype(card_slot) && istype(card_slot2) if(card_slot) - if(card_slot.stored_card || (istype(card_slot2) && card_slot2.stored_card)) + if(card_slot.stored_card || (istype(card_slot2) && card_slot2?.stored_card)) var/obj/item/card/id/first_ID = card_slot.stored_card var/obj/item/card/id/second_ID = card_slot2.stored_card var/multiple_cards = istype(first_ID) && istype(second_ID) @@ -64,3 +64,11 @@ . += "It has a printer installed." if(user_is_adjacent) . += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper].
" + + var/obj/item/computer_hardware/ai_interface/ai_interface = get_modular_computer_part(MC_AI_NETWORK) + if(ai_interface) + if(ai_interface.connected_cable) + . += "It has an AI network interface. It is currently connected to an ethernet cable." + else + . += "It has an AI network interface." + diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index e83c8b988c72..4a98c3eb0625 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -50,7 +50,7 @@ var/max_hardware_size = 0 /// Amount of steel sheets refunded when disassembling an empty frame of this computer. var/steel_sheet_cost = 5 - /// What set of icons should be used for program overlays. + /// What set of icons should be used for program overlays. curently unused var/overlay_skin = null integrity_failure = 50 @@ -156,6 +156,9 @@ if(user.canUseTopic(src, BE_CLOSE)) var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] + var/obj/item/computer_hardware/ai_slot/ai_slot = all_components[MC_AI] + if(ai_slot) + ai_slot.try_eject(user) if(card_slot2) var/obj/item/card/id/target_id_card = card_slot2.stored_card if(!target_id_card) @@ -175,7 +178,10 @@ /obj/item/modular_computer/RemoveID() var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] - return (card_slot2?.try_eject() || card_slot?.try_eject()) //Try the secondary one first. + if(card_slot2?.try_eject() || card_slot?.try_eject()) //Try the secondary one first. + update_appearance(UPDATE_ICON) + return TRUE + return FALSE /obj/item/modular_computer/InsertID(obj/item/inserting_item) var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] @@ -189,7 +195,7 @@ return FALSE if((card_slot?.try_insert(inserting_id)) || (card_slot2?.try_insert(inserting_id))) - update_appearance() + update_appearance(UPDATE_ICON) return TRUE //to_chat(user, "This computer doesn't have an open card slot.") return FALSE @@ -262,13 +268,18 @@ /obj/item/modular_computer/examine(mob/user) . = ..() - if(obj_integrity <= integrity_failure) + if(atom_integrity <= integrity_failure) . += span_danger("It is heavily damaged!") - else if(obj_integrity < max_integrity) + else if(atom_integrity < max_integrity) . += span_warning("It is damaged.") . += get_modular_computer_parts_examine(user) +/obj/item/modular_computer/update_icon(updates=ALL) + if(!physical) + return + return ..() + /obj/item/modular_computer/update_icon_state() if(!icon_state_powered || !icon_state_unpowered) //no valid icon, don't update. return ..() @@ -281,9 +292,13 @@ if(!init_icon) return +// if(overlay_skin) +// program_overlay = "[overlay_skin]-" + if(!enabled && use_power() && !isnull(icon_state_screensaver)) + . += mutable_appearance(init_icon, icon_state_screensaver) if(enabled) . += active_program ? mutable_appearance(init_icon, active_program.program_icon_state) : mutable_appearance(init_icon, icon_state_menu) - if(obj_integrity <= integrity_failure) + if(atom_integrity <= integrity_failure) . += mutable_appearance(init_icon, "bsod") . += mutable_appearance(init_icon, "broken") @@ -316,7 +331,7 @@ /obj/item/modular_computer/proc/turn_on(mob/user) var/issynth = issilicon(user) // Robots and AIs get different activation messages. - if(obj_integrity <= integrity_failure) + if(atom_integrity <= integrity_failure) if(issynth) to_chat(user, span_warning("You send an activation signal to \the [src], but it responds with an error code. It must be damaged.")) else @@ -349,7 +364,7 @@ last_power_usage = 0 return FALSE - if(obj_integrity <= integrity_failure) + if(atom_integrity <= integrity_failure) shutdown_computer() return FALSE @@ -580,7 +595,7 @@ return if(W.tool_behaviour == TOOL_WELDER) - if(obj_integrity == max_integrity) + if(atom_integrity == max_integrity) to_chat(user, span_warning("\The [src] does not require repairs.")) return @@ -589,11 +604,11 @@ to_chat(user, span_notice("You begin repairing damage to \the [src]...")) if(W.use_tool(src, user, 20, volume=50, amount=1)) - obj_integrity = max_integrity + update_integrity(max_integrity) to_chat(user, span_notice("You repair \the [src].")) return - ..() + return ..() // Used by processor to relay qdel() to machinery type. /obj/item/modular_computer/proc/relay_qdel() @@ -614,19 +629,24 @@ if(istype(new_part, /obj/item/computer_hardware)) var/result = install_component(new_part) if(result == FALSE) - CRASH("[src] failed to install starting component for an unknown reason") + CRASH("[src] failed to install starting component for an unknown reason.") else if(istype(new_part, /obj/item/stock_parts/cell/computer)) var/new_cell = new /obj/item/computer_hardware/battery(src, part) qdel(new_part) var/result = install_component(new_cell) if(result == FALSE) - CRASH("[src] failed to install starting cell for an unknown reason") + CRASH("[src] failed to install starting cell for an unknown reason.") /obj/item/modular_computer/proc/install_starting_files() var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] - + if(!istype(hard_drive) || starting_files.len < 1) + if(!starting_files.len < 1) + CRASH("[src] failed to install files due to not having a hard drive even though it has starting files.") + return for(var/datum/computer_file/file in starting_files) var/result = hard_drive.store_file(file) + if(result == FALSE) + CRASH("[src] failed to install starting files for an unknown reason.") if(istype(result, initial_program) && istype(result, /datum/computer_file/program)) var/datum/computer_file/program/program = result if(program.requires_ntnet && program.network_destination) @@ -636,6 +656,17 @@ program.alert_pending = FALSE enabled = TRUE +/obj/item/modular_computer/pickup(mob/user) + . = ..() + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(parent_moved)) + +/obj/item/modular_computer/dropped(mob/user) + . = ..() + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + +/obj/item/modular_computer/proc/parent_moved() + SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED) + /// Sets visible messages to also send to holder because coders didn't know it didn't do this /obj/item/modular_computer/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags) . = ..() @@ -644,3 +675,4 @@ /obj/item/modular_computer/proc/uplink_check(mob/living/M, code) return SEND_SIGNAL(src, COMSIG_NTOS_CHANGE_RINGTONE, M, code) & COMPONENT_STOP_RINGTONE_CHANGE + diff --git a/code/modules/modular_computers/computers/item/computer_damage.dm b/code/modules/modular_computers/computers/item/computer_damage.dm index e61f2fe08478..14dc9413c169 100644 --- a/code/modules/modular_computers/computers/item/computer_damage.dm +++ b/code/modules/modular_computers/computers/item/computer_damage.dm @@ -1,6 +1,6 @@ /obj/item/modular_computer/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - var/component_probability = min(50, max(damage_amount*0.1, 1 - obj_integrity/max_integrity)) + var/component_probability = min(50, max(damage_amount*0.1, 1 - atom_integrity/max_integrity)) switch(damage_flag) if(BULLET) component_probability = damage_amount * 0.5 diff --git a/code/modules/modular_computers/computers/item/laptop/laptop.dm b/code/modules/modular_computers/computers/item/laptop/laptop.dm index 585a8dec1b1c..0d53e0fff33f 100644 --- a/code/modules/modular_computers/computers/item/laptop/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop/laptop.dm @@ -40,10 +40,14 @@ . = ..() if(screen_on) return - SSvis_overlays.remove_vis_overlay(physical, physical.managed_vis_overlays) icon_state = icon_state_closed item_state = icon_state_closed +/obj/item/modular_computer/laptop/update_overlays() + if(!screen_on) + return + return ..() + /obj/item/modular_computer/laptop/attack_self(mob/user) if(!screen_on) try_toggle_open(user) diff --git a/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm b/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm index 6c21fdf9aba1..93b0e8440603 100644 --- a/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm +++ b/code/modules/modular_computers/computers/item/laptop/laptop_presets.dm @@ -37,3 +37,14 @@ new /datum/computer_file/program/secureye/mining ) . = ..() + +/obj/item/modular_computer/laptop/preset/network_admin + desc = "A multi-purpose laptop often used by network admins." + starting_files = list(new /datum/computer_file/program/ai/ai_network_interface) + starting_components = list( /obj/item/computer_hardware/processor_unit/small, + /obj/item/stock_parts/cell/computer, + /obj/item/computer_hardware/hard_drive, + /obj/item/computer_hardware/network_card, + /obj/item/computer_hardware/ai_interface, + /obj/item/computer_hardware/ai_slot, + /obj/item/computer_hardware/card_slot) diff --git a/code/modules/modular_computers/computers/item/pda/pda.dm b/code/modules/modular_computers/computers/item/pda/pda.dm index a3dedd9a99f1..262c798ea7bc 100644 --- a/code/modules/modular_computers/computers/item/pda/pda.dm +++ b/code/modules/modular_computers/computers/item/pda/pda.dm @@ -1,13 +1,37 @@ /obj/item/modular_computer/tablet/pda name = "\improper PDA" icon = 'icons/obj/modular_pda.dmi' - icon_state = "pda-red" - icon_state_base = "pda" + icon_state = "pda" + icon_state_base = "tablet" icon_state_unpowered = "pda" icon_state_powered = "pda" + icon_state_menu = "menu" + greyscale_config = /datum/greyscale_config/tablet + greyscale_colors = "#999875#a92323" + + variants = null + hardware_flag = PROGRAM_PDA max_hardware_size = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL max_bays = 1 steel_sheet_cost = 1 slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT + +/obj/item/modular_computer/tablet/pda/update_overlays() + . = ..() + var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] + var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] + var/computer_id_slot = card_slot2?.stored_card || card_slot?.stored_card + if(computer_id_slot) + . += mutable_appearance(initial(icon), "id_overlay") + if(light_on) + . += mutable_appearance(initial(icon), "light_overlay") + if(inserted_pai) + . += mutable_appearance(initial(icon), "pai_inserted") + +/obj/item/modular_computer/tablet/pda/verb/verb_toggle_light() + set category = "Object" + set name = "Toggle Flashlight" + + toggle_flashlight() diff --git a/code/modules/modular_computers/computers/item/pda/pda_presets.dm b/code/modules/modular_computers/computers/item/pda/pda_presets.dm index 55a6780993a4..190ebefc20b7 100644 --- a/code/modules/modular_computers/computers/item/pda/pda_presets.dm +++ b/code/modules/modular_computers/computers/item/pda/pda_presets.dm @@ -1,11 +1,12 @@ /obj/item/modular_computer/tablet/pda/preset - starting_components = list( /obj/item/computer_hardware/processor_unit/pda, - /obj/item/stock_parts/cell/computer/micro, - /obj/item/computer_hardware/hard_drive/small/pda, - /obj/item/computer_hardware/network_card, - /obj/item/computer_hardware/card_slot, - /obj/item/computer_hardware/printer/mini - ) + starting_components = list( + /obj/item/computer_hardware/processor_unit/pda, + /obj/item/stock_parts/cell/computer/micro, + /obj/item/computer_hardware/hard_drive/small/pda, + /obj/item/computer_hardware/network_card, + /obj/item/computer_hardware/card_slot, + /obj/item/computer_hardware/printer/mini, + ) starting_files = list( new /datum/computer_file/program/budgetorders, new /datum/computer_file/program/bounty_board) @@ -14,109 +15,224 @@ /obj/item/modular_computer/tablet/pda/preset/basic desc = "A standard issue PDA often given to station personnel." -/obj/item/modular_computer/tablet/pda/preset/chem - starting_components = list( /obj/item/computer_hardware/processor_unit/pda, - /obj/item/stock_parts/cell/computer/micro, - /obj/item/computer_hardware/hard_drive/small/pda, - /obj/item/computer_hardware/network_card, - /obj/item/computer_hardware/card_slot, - /obj/item/computer_hardware/sensorpackage - ) -/obj/item/modular_computer/tablet/pda/preset/chem/Initialize(mapload) - starting_files |= list( - new /datum/computer_file/program/chemscan - ) - . = ..() +/obj/item/modular_computer/tablet/pda/preset/scientist + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#FAFAFA#000099#B347BC" + +/obj/item/modular_computer/tablet/pda/preset/geneticist + greyscale_config = /datum/greyscale_config/tablet/stripe_split + greyscale_colors = "#FAFAFA#000099#0097CA" /obj/item/modular_computer/tablet/pda/preset/medical -/obj/item/modular_computer/tablet/pda/preset/medical/Initialize(mapload) - starting_files |= list( - new /datum/computer_file/program/crew_monitor - ) - . = ..() + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#FAFAFA#000099#3F96CC" -/obj/item/modular_computer/tablet/pda/preset/paramed -/obj/item/modular_computer/tablet/pda/preset/paramed/Initialize(mapload) +/obj/item/modular_computer/tablet/pda/preset/medical/Initialize(mapload) starting_files |= list( new /datum/computer_file/program/crew_monitor, - new /datum/computer_file/program/radar/lifeline ) - . = ..() - -/obj/item/modular_computer/tablet/pda/preset/engineering -/obj/item/modular_computer/tablet/pda/preset/engineering/Initialize(mapload) + return ..() + +/obj/item/modular_computer/tablet/pda/preset/medical/chem + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#FAFAFA#355FAC#EA6400" + starting_components = list( + /obj/item/computer_hardware/processor_unit/pda, + /obj/item/stock_parts/cell/computer/micro, + /obj/item/computer_hardware/hard_drive/small/pda, + /obj/item/computer_hardware/network_card, + /obj/item/computer_hardware/card_slot, + /obj/item/computer_hardware/sensorpackage, + ) + +/obj/item/modular_computer/tablet/pda/preset/medical/chem/Initialize(mapload) starting_files |= list( - new /datum/computer_file/program/alarm_monitor, - new /datum/computer_file/program/supermatter_monitor, - new /datum/computer_file/program/nuclear_monitor, - new /datum/computer_file/program/power_monitor + new /datum/computer_file/program/chemscan, ) - . = ..() + return ..() -/obj/item/modular_computer/tablet/pda/preset/warden -/obj/item/modular_computer/tablet/pda/preset/warden/Initialize(mapload) +/obj/item/modular_computer/tablet/pda/preset/medical/paramed/Initialize(mapload) starting_files |= list( - new /datum/computer_file/program/secureye, + new /datum/computer_file/program/radar/lifeline, ) - . = ..() + return ..() + +/obj/item/modular_computer/tablet/pda/preset/medical/viro + greyscale_config = /datum/greyscale_config/tablet/stripe_split + greyscale_colors = "#FAFAFA#355FAC#57C451" /obj/item/modular_computer/tablet/pda/preset/robo + greyscale_config = /datum/greyscale_config/tablet/stripe_split + greyscale_colors = "#484848#0099CC#D94927" + /obj/item/modular_computer/tablet/pda/preset/robo/Initialize(mapload) starting_files |= list( new /datum/computer_file/program/robocontrol, ) - . = ..() + return ..() /obj/item/modular_computer/tablet/pda/preset/cargo + greyscale_colors = "#D6B328#6506CA" + /obj/item/modular_computer/tablet/pda/preset/cargo/Initialize(mapload) starting_files |= list( - new /datum/computer_file/program/bounty_board, - new /datum/computer_file/program/budgetorders, - new /datum/computer_file/program/cargobounty +// new /datum/computer_file/program/bounty_board, Both of these come with the preset PDA hardware (/obj/item/computer_hardware/hard_drive/small/pda). +// new /datum/computer_file/program/budgetorders, Uncomment if any change is made to that in question. + new /datum/computer_file/program/cargobounty, ) - . = ..() + return ..() + +/obj/item/modular_computer/tablet/pda/preset/cargo/quartermaster + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#D6B328#6506CA#927444" -/obj/item/modular_computer/tablet/pda/preset/basic/atmos - starting_components = list( /obj/item/computer_hardware/processor_unit/pda, - /obj/item/stock_parts/cell/computer/micro, - /obj/item/computer_hardware/hard_drive/small/pda, - /obj/item/computer_hardware/network_card, - /obj/item/computer_hardware/card_slot, - /obj/item/computer_hardware/sensorpackage) +/obj/item/modular_computer/tablet/pda/preset/shaft_miner + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#927444#D6B328#6C3BA1" + +/obj/item/modular_computer/tablet/pda/preset/engineering + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#D99A2E#69DBF3#E3DF3D" -/obj/item/modular_computer/tablet/pda/preset/basic/atmos/Initialize(mapload) +/obj/item/modular_computer/tablet/pda/preset/engineering/Initialize(mapload) + starting_files |= list( + new /datum/computer_file/program/alarm_monitor, + new /datum/computer_file/program/supermatter_monitor, + new /datum/computer_file/program/nuclear_monitor, + new /datum/computer_file/program/power_monitor + ) + return ..() + +/obj/item/modular_computer/tablet/pda/preset/atmos + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#EEDC43#727272#00E5DA" + starting_components = list( + /obj/item/computer_hardware/processor_unit/pda, + /obj/item/stock_parts/cell/computer/micro, + /obj/item/computer_hardware/hard_drive/small/pda, + /obj/item/computer_hardware/network_card, + /obj/item/computer_hardware/card_slot, + /obj/item/computer_hardware/sensorpackage, + ) + +/obj/item/modular_computer/tablet/pda/preset/atmos/Initialize(mapload) starting_files |= list( new /datum/computer_file/program/atmosscan, new /datum/computer_file/program/alarm_monitor, new /datum/computer_file/program/supermatter_monitor, new /datum/computer_file/program/nuclear_monitor ) - . = ..() + return ..() -/obj/item/modular_computer/tablet/pda/preset/basic/mime - pen_type = /obj/item/toy/crayon/mime +/obj/item/modular_computer/tablet/pda/preset/network_admin + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#EEDC43#69DBF3#00CC00" + +/obj/item/modular_computer/tablet/pda/preset/janitor + greyscale_colors = "#933ea8#235AB2" + +/obj/item/modular_computer/tablet/pda/preset/chaplain + greyscale_config = /datum/greyscale_config/tablet/chaplain + greyscale_colors = "#333333#D11818" + +/obj/item/modular_computer/tablet/pda/preset/botanist + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#50E193#E26F41#71A7CA" -/obj/item/modular_computer/tablet/pda/preset/basic/fountainpen // QM, Lawyer, Curator, Bartender +/obj/item/modular_computer/tablet/pda/preset/cook + greyscale_colors = "#FAFAFA#A92323" + +/obj/item/modular_computer/tablet/pda/preset/artist + greyscale_colors = "#3E1111#112334" + +/obj/item/modular_computer/tablet/pda/preset/fountainpen //Lawyer, Curator, Bartender pen_type = /obj/item/pen/fountain +/obj/item/modular_computer/tablet/pda/preset/fountainpen/lawyer + greyscale_colors = "#4C76C8#FFE243" + +/obj/item/modular_computer/tablet/pda/preset/fountainpen/bartender + greyscale_colors = "#333333#C7C7C7" + +/obj/item/modular_computer/tablet/pda/preset/fountainpen/curator + desc = "A small experimental microcomputer." + icon_state = "pda-library" + icon_state_unpowered = "pda-library" + icon_state_powered = "pda-library" + greyscale_config = null + greyscale_colors = null + // Honk -/obj/item/modular_computer/tablet/pda/preset/basic/clown + +/obj/item/modular_computer/tablet/pda/preset/mime + greyscale_config = /datum/greyscale_config/tablet/mime + greyscale_colors = "#FAFAFA#EA3232" + pen_type = /obj/item/toy/crayon/mime + +/obj/item/modular_computer/tablet/pda/preset/clown desc = "A hilarious PDA often given to station pranksters." - finish_color = "pink" + icon_state = "pda-clown" + icon_state_unpowered = "pda-clown" + icon_state_powered = "pda-clown" + greyscale_config = /datum/greyscale_config/tablet/clown //config doesn't actually do anything but - + greyscale_colors = null //- hey if you want to set up some cool shit go ahead pen_type = /obj/item/toy/crayon/rainbow -/obj/item/modular_computer/tablet/pda/preset/basic/clown/Initialize(mapload) +/obj/item/modular_computer/tablet/pda/preset/clown/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING) +// Honk end + +/obj/item/modular_computer/tablet/pda/preset/security + greyscale_colors = "#EA3232#0000CC" + +/obj/item/modular_computer/tablet/pda/preset/security/detective + greyscale_colors = "#805A2F#990202" + +/obj/item/modular_computer/tablet/pda/preset/security/warden + greyscale_config = /datum/greyscale_config/tablet/stripe_split + greyscale_colors = "#EA3232#0000CC#363636" + +/obj/item/modular_computer/tablet/pda/preset/security/warden/Initialize(mapload) + starting_files |= list( + new /datum/computer_file/program/secureye, + ) + return ..() + //for inside one of the nukie lockers -/obj/item/modular_computer/tablet/pda/preset/basic/syndicate - desc = "A standard issue PDA often given to syndicate agents." +/obj/item/modular_computer/tablet/pda/preset/syndicate + desc = "Based off Nanotrasen's PDAs, this one has been reverse-engineered and loaded with illegal software provided by the Syndicate." + greyscale_config = /datum/greyscale_config/tablet/stripe_thick + greyscale_colors = "#A80001#5C070F#000000" -/obj/item/modular_computer/tablet/pda/preset/basic/syndicate/Initialize(mapload) - . = ..() +/obj/item/modular_computer/tablet/pda/preset/syndicate/Initialize(mapload) obj_flags |= EMAGGED //starts emagged starting_files |= list( - new /datum/computer_file/program/bomberman + new /datum/computer_file/program/bomberman, + ) + return ..() + +// The worst thing mankind can fathom - used in clown ops and nukie clown costume +/obj/item/modular_computer/tablet/pda/preset/clown/syndicate + desc = "A hilariously terrifying PDA reverse-engineered by the Syndicate, given to their most unhinged operatives." + +/obj/item/modular_computer/tablet/pda/preset/clown/syndicate/Initialize(mapload) + obj_flags |= EMAGGED //starts emagged //rather have this than re-do clown stuff over + starting_files |= list( + new /datum/computer_file/program/bomberman, + ) + return ..() + +/obj/item/modular_computer/tablet/pda/preset/bureaucrat + desc = "A standard issue PDA issued to certain Nanotrasen personnel to help with inspections." + greyscale_config = /datum/greyscale_config/tablet/captain + greyscale_colors = "#2EBE3B#FF0000#FFFFFF#FFD55B" // Rockin the company colors + pen_type = /obj/item/pen/fountain/captain + +/obj/item/modular_computer/tablet/pda/preset/bureaucrat/Initialize(mapload) + starting_files |= list( + new /datum/computer_file/program/crew_manifest, + new /datum/computer_file/program/paperwork_printer ) - \ No newline at end of file + return ..() diff --git a/code/modules/modular_computers/computers/item/phone/phone_presets.dm b/code/modules/modular_computers/computers/item/phone/phone_presets.dm index 4804ecb26652..14be4436cc5d 100644 --- a/code/modules/modular_computers/computers/item/phone/phone_presets.dm +++ b/code/modules/modular_computers/computers/item/phone/phone_presets.dm @@ -46,7 +46,8 @@ /obj/item/modular_computer/tablet/phone/preset/advanced/command/Initialize(mapload) starting_files |= list( - new /datum/computer_file/program/card_mod + new /datum/computer_file/program/card_mod, + new /datum/computer_file/program/synth_requester ) . = ..() diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 150c18b2cf05..fc2faa862ea8 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -32,7 +32,7 @@ hardware_flag = machinery_computer.hardware_flag max_hardware_size = machinery_computer.max_hardware_size steel_sheet_cost = machinery_computer.steel_sheet_cost - obj_integrity = machinery_computer.obj_integrity + update_integrity(machinery_computer.get_integrity()) max_integrity = machinery_computer.max_integrity integrity_failure = machinery_computer.integrity_failure base_active_power_usage = machinery_computer.base_active_power_usage diff --git a/code/modules/modular_computers/computers/item/tablet/tablet.dm b/code/modules/modular_computers/computers/item/tablet/tablet.dm index 78fac57fa5e9..ccac965791f3 100644 --- a/code/modules/modular_computers/computers/item/tablet/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet/tablet.dm @@ -6,6 +6,7 @@ icon_state_unpowered = "tablet" icon_state_powered = "tablet" icon_state_menu = "menu" + icon_state_screensaver = null id_rename = TRUE hardware_flag = PROGRAM_TABLET max_hardware_size = WEIGHT_CLASS_SMALL @@ -36,9 +37,9 @@ var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] if(card_slot2?.stored_card || card_slot?.stored_card) + update_appearance(UPDATE_ICON) return ..() - else - remove_pen() + remove_pen() else return ..() diff --git a/code/modules/modular_computers/computers/machinery/console/console_presets.dm b/code/modules/modular_computers/computers/machinery/console/console_presets.dm index c475a3d2109c..4f91a87cc526 100644 --- a/code/modules/modular_computers/computers/machinery/console/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console/console_presets.dm @@ -219,3 +219,18 @@ qdel(frame) return FALSE return ..() + + +// ===== NETWORK ADMIN CONSOLE ===== +/obj/machinery/modular_computer/console/preset/netmin + console_department = "Engineering" + name = "ai network console" + desc = "A stationary computer. This one comes preloaded with ai network administration software" + starting_files = list( new /datum/computer_file/program/ai/ai_network_interface, new /datum/computer_file/program/aidiag) + initial_program = /datum/computer_file/program/ai/ai_network_interface + starting_components = list( /obj/item/computer_hardware/network_card/wired, + /obj/item/computer_hardware/recharger/APC, + /obj/item/computer_hardware/hard_drive/super, + /obj/item/computer_hardware/processor_unit, + /obj/item/computer_hardware/ai_slot, + /obj/item/computer_hardware/card_slot) diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 91dc2c61bf20..bbb7f95e8e7a 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -61,7 +61,7 @@ if(cpu && !(cpu.resistance_flags & INDESTRUCTIBLE)) if(cpu.resistance_flags & ON_FIRE) . += span_warning("The CPU is on fire!") - var/healthpercent = (cpu.obj_integrity/cpu.max_integrity) * 100 + var/healthpercent = (cpu.get_integrity()/cpu.max_integrity) * 100 switch(healthpercent) if(50 to 99) . += "The CPU looks slightly damaged." @@ -104,7 +104,7 @@ else if(!(stat & NOPOWER)) . += screen_icon_screensaver - if(cpu.obj_integrity <= cpu.integrity_failure) + if(cpu.get_integrity() <= cpu.integrity_failure) . += "bsod" . += "broken" return . diff --git a/code/modules/modular_computers/file_system/programs/ai_network/_ai_network_program.dm b/code/modules/modular_computers/file_system/programs/ai_network/_ai_network_program.dm new file mode 100644 index 000000000000..9d37fd686f9c --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ai_network/_ai_network_program.dm @@ -0,0 +1,67 @@ +/datum/computer_file/program/ai + filename = "DEBUG" + filedesc = "DEBUG" + category = PROGRAM_CATEGORY_ENGI + program_icon_state = "power_monitor" + extended_desc = "This program connects to a local AI network to allow for administrative access" + ui_header = "power_norm.gif" + transfer_access = ACCESS_NETWORK + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET + requires_ntnet = FALSE + size = 8 + tgui_id = null + program_icon = "network-wired" + available_on_ntnet = FALSE + + var/obj/structure/ethernet_cable/attached_cable + + +/datum/computer_file/program/ai/run_program(mob/living/user) + . = ..(user) + if(ismachinery(computer.physical)) + search() + + +/datum/computer_file/program/ai/process_tick() + if(ismachinery(computer.physical) && !get_ainet()) + search() + + +/datum/computer_file/program/ai/proc/search() + var/turf/T = get_turf(computer) + attached_cable = locate(/obj/structure/ethernet_cable) in T + if(attached_cable) + return + +/datum/computer_file/program/ai/proc/get_ainet() + if(ismachinery(computer.physical)) + if(attached_cable) + return attached_cable.network + if(computer.all_components[MC_AI_NETWORK]) + var/obj/item/computer_hardware/ai_interface/ai_interface = computer.all_components[MC_AI_NETWORK] + if(ai_interface) + return ai_interface.get_network() + return FALSE + +/datum/computer_file/program/ai/ui_data(mob/user) + var/list/data = get_header_data() + + var/datum/ai_network/net = get_ainet() + data["has_ai_net"] = net + + return data + +/datum/computer_file/program/ai/proc/get_ai(get_card = FALSE) + var/obj/item/computer_hardware/ai_slot/ai_slot + + if(computer) + ai_slot = computer.all_components[MC_AI] + + if(computer && ai_slot && ai_slot.check_functionality()) + if(ai_slot.enabled && ai_slot.stored_card) + if(get_card) + return ai_slot.stored_card + if(ai_slot.stored_card.AI) + return ai_slot.stored_card.AI + + diff --git a/code/modules/modular_computers/file_system/programs/ai_network/ai_benchmark.dm b/code/modules/modular_computers/file_system/programs/ai_network/ai_benchmark.dm new file mode 100644 index 000000000000..2944d1f8651e --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ai_network/ai_benchmark.dm @@ -0,0 +1,28 @@ +/datum/computer_file/program/ai/benchmark + filename = "aibenchmark" + filedesc = "Network Benchmarking Tool" + + program_icon_state = "power_monitor" + extended_desc = "This program connects to a historical NT records and compares them with the local network." + ui_header = "power_norm.gif" + + size = 4 + tgui_id = "NtosAIBenchmark" + program_icon = "network-wired" + available_on_ntnet = TRUE + +/datum/computer_file/program/ai/benchmark/ui_data(mob/user) + var/list/data = ..() + + if(!data["has_ai_net"]) + return data + + var/datum/ai_network/net = data["has_ai_net"] + + data["total_cpu"] = net.resources.total_cpu() + data["total_ram"] = net.resources.total_ram() + + data["ram_records"] = SSpersistence.ai_network_rankings["ram"] + data["cpu_records"] = SSpersistence.ai_network_rankings["cpu"] + + return data diff --git a/code/modules/modular_computers/file_system/programs/ai_network/ainetworkinterface.dm b/code/modules/modular_computers/file_system/programs/ai_network/ainetworkinterface.dm new file mode 100644 index 000000000000..0e3d44b47c83 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/ai_network/ainetworkinterface.dm @@ -0,0 +1,510 @@ +/datum/computer_file/program/ai/ai_network_interface + filename = "aiinterface" + filedesc = "AI Network Interface" + + program_icon_state = "power_monitor" + extended_desc = "This program connects to a local AI network to allow for administrative access" + ui_header = "power_norm.gif" + + size = 8 + tgui_id = "NtosAIMonitor" + program_icon = "network-wired" + available_on_ntnet = TRUE + + var/obj/machinery/ai/networking/active_networking + var/mob/networking_operator + var/mob/living/silicon/ai/downloading + var/mob/user_downloading + var/download_progress = 0 + var/download_warning = FALSE + + +/datum/computer_file/program/ai/ai_network_interface/process_tick() + . = ..() + + if(networking_operator && (!networking_operator.Adjacent(computer.physical))) + if(active_networking) + active_networking.remote_control = null + networking_operator = null + + if(!get_ainet()) + stop_download() + return + if(!get_ai(TRUE)) + stop_download() + return + + if(downloading && download_progress >= 50 && !download_warning) + var/turf/T = get_turf(computer.physical) + if(!downloading.mind && downloading.deployed_shell.mind) + to_chat(downloading.deployed_shell, span_userdanger("Warning! Download is 50% completed! Download location: [get_area(computer.physical)] ([T.x], [T.y], [T.z])!")) + else + to_chat(downloading, span_userdanger("Warning! Download is 50% completed! Download location: [get_area(computer.physical)] ([T.x], [T.y], [T.z])!")) + download_warning = TRUE + if(downloading && download_progress >= 100) + finish_download() + + if(downloading) + if(!downloading.can_download) + stop_download() + return + var/datum/ai_network/local_network = get_ainet() + if(downloading.ai_network.resources != local_network.resources) //If we don't share resources we aren't connected, more performant way of checking than get_all_ais() + stop_download() + return + download_progress += AI_DOWNLOAD_PER_PROCESS * downloading.downloadSpeedModifier + + +/datum/computer_file/program/ai/ai_network_interface/ui_data(mob/user) + var/list/data = ..() + + if(!data["has_ai_net"]) + return data + + var/datum/ai_network/net = data["has_ai_net"] + + + //Networking devices control + data["networking_devices"] = list() + for(var/obj/machinery/ai/networking/N in net.get_local_nodes_oftype(/obj/machinery/ai/networking)) + data["networking_devices"] += list(list("label" = N.label, "ref" = REF(N), "has_partner" = N.partner ? N.partner.label : null)) + + //Downloading/Uploadingainet + data["ai_list"] = list() + for(var/mob/living/silicon/ai/AI in net.get_all_ais()) + var/being_hijacked = AI.hijacking ? TRUE : FALSE + data["ai_list"] += list(list("name" = AI.name, "ref" = REF(AI), "can_download" = AI.can_download, "health" = AI.health, "active" = AI.mind ? TRUE : FALSE, "being_hijacked" = being_hijacked, "in_core" = istype(AI.loc, /obj/machinery/ai/data_core), + "assigned_cpu" = net.resources.cpu_assigned[AI] ? net.resources.cpu_assigned[AI] : 0, "assigned_ram" = net.resources.ram_assigned[AI] ? net.resources.ram_assigned[AI] : 0)) + + data["is_infiltrator"] = is_infiltrator(user) + + data["connection_type"] = ismachinery(computer.physical) ? "wired connection" : "local wire shunt" + data["network_name"] = net.label + + data["current_ai_ref"] = null + if(isAI(user)) + data["current_ai_ref"] = REF(user) + + data["human_only"] = net.resources.human_lock + + data["intellicard"] = get_ai(TRUE) + var/mob/living/silicon/ai/card_ai = get_ai() + if(card_ai) + data["intellicard_ai"] = card_ai.real_name + data["intellicard_ai_health"] = card_ai.health + else + data["intellicard_ai"] = null + data["intellicard_ai_health"] = 0 + + + if(downloading) + data["downloading"] = downloading.real_name + data["download_progress"] = download_progress + data["downloading_ref"] = REF(downloading) + else + data["downloading"] = null + data["download_progress"] = 0 + + data["holding_mmi"] = user.is_holding_item_of_type(/obj/item/mmi) ? TRUE : FALSE + + data["can_upload"] = net.find_data_core() ? TRUE : FALSE + + + //Resource allocation + + data["total_cpu"] = net.resources.total_cpu() + data["total_ram"] = net.resources.total_ram() + + + data["total_assigned_cpu"] = net.resources.total_cpu_assigned() + data["total_assigned_ram"] = net.resources.total_ram_assigned() + + //Local processing + + data["network_cpu_assignments"] = list() + var/remaining_net_cpu = 1 + for(var/project in GLOB.possible_ainet_activities) + var/assigned = net.local_cpu_usage[project] ? net.local_cpu_usage[project] : 0 + data["network_cpu_assignments"] += list(list("name" = project, "assigned" = assigned, "tagline" = GLOB.ainet_activity_tagline[project], "description" = GLOB.ainet_activity_description[project])) + remaining_net_cpu -= assigned + + data["network_ref"] = REF(net) + data["network_assigned_ram"] = net.resources.ram_assigned[net] ? net.resources.ram_assigned[net] : 0 + data["network_assigned_cpu"] = net.resources.cpu_assigned[net] ? net.resources.cpu_assigned[net] : 0 + data["bitcoin_amount"] = round(net.bitcoin_payout, 1) + + data["remaining_network_cpu"] = remaining_net_cpu + + data["networks"] = list() + for(var/datum/ai_network/subnet in net.resources.networks) + if(subnet.cables.len || subnet.nodes.len) + var/area/area + if(length(subnet.cables)) + area = get_area(subnet.cables[1]) + else + area = get_area(subnet.nodes[1]) + if(!area) + continue + var/synth_list = list() + for(var/mob/living/carbon/synth in subnet.synth_list) + synth_list += list(list("name" = synth.real_name, "ref" = REF(synth))) + data["networks"] += list(list("ref" = REF(subnet), "name" = subnet.custom_name ? subnet.custom_name : area.name, "cpu" = net.resources.cpu_sources[subnet], "ram" = net.resources.ram_sources[subnet], "synths" = synth_list , "current_net" = (subnet == net))) + + return data + +/datum/computer_file/program/ai/ai_network_interface/ui_act(action, params, datum/tgui/ui) + if(..()) + return + var/mob/user = usr + var/datum/ai_network/net = get_ainet() + if(!net) + return + + switch(action) + //General actions + if("change_network_name") + var/new_label = stripped_input(usr, "Enter new label", "Set label", max_length = 32) + if(new_label) + if(isnotpretty(new_label)) + to_chat(usr, span_notice("The machine rejects the input. See rule 0.1.")) + var/log_message = "[key_name(usr)] just tripped a pretty filter: '[new_label]'." + message_admins(log_message) + log_say(log_message) + return + net.label = new_label + . = TRUE + //AI interaction, downloading/uploading + if("apply_object") + if(!net) + return TRUE + var/applied_something = FALSE + var/mob/living/silicon/ai/targeted_ai = locate(params["ai_ref"]) in net.get_all_ais() + if(!targeted_ai) + to_chat(user, span_warning("Unable to locate AI.")) + return TRUE + + var/obj/item/surveillance_upgrade/upgrade = user.is_holding_item_of_type(/obj/item/surveillance_upgrade) + if(upgrade) + applied_something = TRUE + upgrade.afterattack(targeted_ai, user) + + var/obj/item/malf_upgrade/malf_upgrade = user.is_holding_item_of_type(/obj/item/malf_upgrade) + if(malf_upgrade) + applied_something = TRUE + malf_upgrade.afterattack(targeted_ai, user) + if(!applied_something) + to_chat(user, span_warning("You don't have any upgrades to upload!")) + return TRUE + if("upload_person") + if(!net) + return TRUE + var/obj/item/mmi/brain = user.is_holding_item_of_type(/obj/item/mmi) + if(brain) + if(!brain.brainmob) + to_chat(user, span_warning("[brain] is not active!")) + return ..() + SSticker.mode.remove_antag_for_borging(brain.brainmob.mind) + if(!istype(brain.laws, /datum/ai_laws/ratvar)) + remove_servant_of_ratvar(brain.brainmob, TRUE) + var/mob/living/silicon/ai/A + + var/datum/ai_laws/laws = new + laws.set_laws_config() + + if (brain.overrides_aicore_laws) + A = new /mob/living/silicon/ai(computer.physical.loc, brain.laws, brain.brainmob, FALSE, FALSE) + else + A = new /mob/living/silicon/ai(computer.physical.loc, laws, brain.brainmob, FALSE, FALSE) + + A.relocate(TRUE, forced_network = net) + + if(brain.force_replace_ai_name) + A.fully_replace_character_name(A.name, brain.replacement_ai_name()) + SSblackbox.record_feedback("amount", "ais_created", 1) + qdel(brain) + to_chat(user, span_notice("AI succesfully uploaded.")) + return FALSE + if("upload_ai") + if(!net) + return TRUE + var/mob/living/silicon/ai/AI = get_ai() + var/obj/item/aicard/intellicard = get_ai(TRUE) + if(!istype(AI)) + to_chat(user, span_warning("IntelliCard contains no AI!")) + return TRUE + to_chat(AI, span_notice("You are being uploaded. Please stand by...")) + AI.radio_enabled = TRUE + AI.control_disabled = FALSE + AI.relocate(TRUE) + intellicard.AI = null + intellicard.update_icon() + to_chat(user, span_notice("AI successfully uploaded")) + + if("stop_download") + if(isAI(user)) + to_chat(user, span_warning("You need physical access to stop the download!")) + return + stop_download() + + if("start_download") + if(!get_ai(TRUE) || downloading) + return + var/mob/living/silicon/ai/target = locate(params["download_target"]) in net.get_all_ais() + if(!target || !istype(target)) + return + if(!istype(target.loc, /obj/machinery/ai/data_core)) + return + if(!target.can_download) + return + downloading = target + + if(!downloading.mind && downloading.deployed_shell.mind) + to_chat(downloading.deployed_shell, span_userdanger("Warning! Someone is attempting to download you from [get_area(computer.physical)]! (Click here to finish download instantly)")) + else + to_chat(downloading, span_userdanger("Warning! Someone is attempting to download you from [get_area(computer.physical)]! (Click here to finish download instantly)")) + user_downloading = user + download_progress = 0 + . = TRUE + if("skip_download") + if(!downloading) + return + if(user == downloading) + finish_download() + + if("start_hijack") + if(!is_infiltrator(user)) + return + if(!istype(user.get_active_held_item(), /obj/item/ai_hijack_device)) + to_chat(user, span_warning("You need to be holding the serial exploitation unit to initiate the hijacking process!")) + return + var/obj/item/ai_hijack_device/device = user.get_active_held_item() + var/mob/living/silicon/ai/target = locate(params["target_ai"]) in net.get_all_ais() + if(!target || !isAI(target)) + return + var/mob/living/silicon/ai/A = target + if(A.mind && A.mind.has_antag_datum(/datum/antagonist/hijacked_ai)) + to_chat(user, span_warning("[A] has already been hijacked!")) + return + if(A.stat == DEAD) + to_chat(user, span_warning("[A] is dead!")) + return + if(A.hijacking) + to_chat(user, span_warning("[A] is already in the process of being hijacked!")) + return + user.visible_message(span_warning("[user] begins furiously typing something into [computer.physical]...")) + if(do_after(user, 5.5 SECONDS, computer.physical)) + user.dropItemToGround(device) + device.forceMove(A) + A.hijacking = device + A.hijack_start = world.time + A.update_icons() + to_chat(A, span_danger("Unknown device connected to /dev/ttySL0
")) + to_chat(A, span_danger("Connected at 115200 bps")) + to_chat(A, span_binarysay("ntai login: root")) + to_chat(A, span_binarysay("Password: *****r2")) + to_chat(A, span_binarysay("$ dd from=/dev/ttySL0 of=/tmp/ai-hijack bs=4096 && chmod +x /tmp/ai-hijack && tmp/ai-hijack")) + to_chat(A, span_binarysay("111616 bytes (112 KB, 109 KiB) copied, 1 s, 14.4 KB/s")) + message_admins("[ADMIN_LOOKUPFLW(user)] has attached a hijacking device to [ADMIN_LOOKUPFLW(A)]!") + notify_ghosts("[user] has begun to hijack [A]!", source = computer.physical, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/chime.ogg') + + if("stop_hijack") + var/mob/living/silicon/ai/target = locate(params["target_ai"]) in net.get_all_ais() + if(!target || !isAI(target)) + return + var/mob/living/silicon/ai/A = target + + + user.visible_message(span_danger("[user] attempts to cancel a process on [computer.physical]."), span_notice("An unknown process seems to be interacting with [A]! You attempt to end the proccess..")) + if (do_after(user, 10 SECONDS, computer.physical)) + A.hijacking.forceMove(get_turf(computer.physical)) + A.hijacking = null + A.hijack_start = 0 + A.update_icons() + to_chat(A, span_bolddanger("Unknown device disconnected. Systems confirmed secure.")) + else + to_chat(user, span_notice("You fail to remove the device.")) + + //Network control + if("control_networking") + if(!params["ref"]) + return + var/obj/machinery/ai/networking/N = locate(params["ref"]) in net.get_local_nodes_oftype(/obj/machinery/ai/networking) + if(active_networking) + active_networking.remote_control = null + networking_operator = user + active_networking = N + active_networking.remote_control = networking_operator + active_networking.ui_interact(networking_operator) + + //Resource allocation + if("clear_ai_resources") + if(isAI(user) && net.resources.human_lock) + return + var/atom/target_ai = locate(params["target_ai"]) in net.get_all_ais() | net.resources.networks + + net.resources.clear_ai_resources(target_ai) + . = TRUE + + if("set_cpu") + if(isAI(user) && net.resources.human_lock) + return + var/atom/target_ai = locate(params["target_ai"]) in net.get_all_ais() | net.resources.networks + + var/amount = params["amount_cpu"] + if(amount > 1 || amount < 0) + return + net.resources.set_cpu(target_ai, amount) + . = TRUE + if("max_cpu") + if(isAI(user) && net.resources.human_lock) + return + var/atom/target_ai = locate(params["target_ai"]) in net.get_all_ais() | net.resources.networks + + var/amount = (1 - net.resources.total_cpu_assigned()) + net.resources.cpu_assigned[target_ai] + + net.resources.set_cpu(target_ai, amount) + . = TRUE + if("add_ram") + if(isAI(user) && net.resources.human_lock) + return + var/atom/target_ai = locate(params["target_ai"]) in net.get_all_ais() | net.resources.networks + + if(net.resources.total_ram_assigned() >= net.resources.total_ram()) + return + net.resources.add_ram(target_ai, 1) + . = TRUE + + if("remove_ram") + if(isAI(user) && net.resources.human_lock) + return + var/atom/target_ai = locate(params["target_ai"]) in net.get_all_ais() | net.resources.networks + + var/current_ram = net.resources.ram_assigned[target_ai] + + if(current_ram <= 0) + return + net.resources.remove_ram(target_ai, 1) + . = TRUE + + //Local computing + if("allocate_network_cpu") + if(isAI(user) && net.resources.human_lock) + return + var/project_type = params["project_name"] + if(!(project_type in GLOB.possible_ainet_activities)) + return + var/amount = text2num(params["amount"]) + if(amount < 0 || amount > 1) + return + + var/total_cpu_used = 0 + for(var/I in net.local_cpu_usage) + if(I == project_type) + continue + total_cpu_used += net.local_cpu_usage[I] + + if((1 - total_cpu_used) >= amount) + net.local_cpu_usage[project_type] = amount + else + net.local_cpu_usage[project_type] = (1 - total_cpu_used) + + . = TRUE + + if("max_network_cpu") + if(isAI(user) && net.resources.human_lock) + return + var/project_type = params["project_name"] + if(!(project_type in GLOB.possible_ainet_activities)) + return + + var/total_cpu_used = 0 + for(var/I in net.local_cpu_usage) + if(I == project_type) + continue + total_cpu_used += net.local_cpu_usage[I] + + var/amount_to_add = 1 - total_cpu_used + + net.local_cpu_usage[project_type] = amount_to_add + . = TRUE + + if("toggle_human_only") + if(isAI(user)) + return + net.resources.human_lock = !net.resources.human_lock + to_chat(user, span_notice("Network now allows changes [net.resources.human_lock ? "exclusively by organics." : "by all authorized users."]")) + + if("bitcoin_payout") + var/payout_amount = round(net.bitcoin_payout, 1) //Sure you can have your extra 0.5 credits :) + var/obj/item/holochip/holochip = new (computer.physical.drop_location(), payout_amount) + user.put_in_hands(holochip) + to_chat(user, span_notice("Payout of [payout_amount]cr confirmed.")) + net.bitcoin_payout = 0 + + if("transfer_synth") + var/mob/living/carbon/to_transfer = locate(params["synth_target"]) + if(!(to_transfer.ai_network in net.resources.networks)) + return + var/options = list() + for(var/datum/ai_network/subnet in net.resources.networks) + if(subnet.custom_name) + if(options[subnet.custom_name]) + options["[subnet.custom_name] ([rand(1, 999)])"] = subnet //save us by random chance, hopefully + else + options[subnet.custom_name] = subnet + else + var/area_text + if(subnet.cables.len) + var/obj/structure/ethernet_cable/C = subnet.cables[1] + area_text = "[get_area(subnet.cables[0])] ([C.x], [C.y])" + else + var/obj/machinery/N = subnet.nodes[1] + area_text = "[get_area(subnet.nodes[1])] ([N.x], [N.y])" + if(!area_text) + continue + options[area_text] = subnet + + options["Cancel"] = "Cancel" + + var/response = tgui_input_list(user, "Select which network to transfer the synth to", "Synth Network Transfer", options) + + if(response == "Cancel") + return + if(options[response] in net.resources.networks) + var/datum/ai_network/new_net = options[response] + new_net.add_synth(to_transfer) + + + if("rename_network") + var/datum/ai_network/target_net = locate(params["target_net"]) + if(!(target_net in net.resources.networks)) + return + var/new_name = stripped_input(user, "Slect a new name for the network", "Network Name Change", null, 32) + if(isnotpretty(new_name)) + to_chat(user, "Your fingers slip. See rule 0.1.") + var/log_message = "[key_name(user)] just tripped a pretty filter: '[new_name]'." + message_admins(log_message) + log_say(log_message) + return FALSE + target_net.custom_name = new_name + + + +/datum/computer_file/program/ai/ai_network_interface/proc/finish_download() + var/obj/item/aicard/intellicard = get_ai(TRUE) + if(intellicard) + if(!isaicore(downloading.loc)) + stop_download(TRUE) + return + downloading.transfer_ai(AI_TRANS_TO_CARD, user_downloading, null, intellicard) + intellicard.update_icon() + stop_download(TRUE) + +/datum/computer_file/program/ai/ai_network_interface/proc/stop_download(silent = FALSE) + if(downloading) + if(!silent) + to_chat(downloading, span_userdanger("Download stopped.")) + downloading = null + user_downloading = null + download_progress = 0 + download_warning = FALSE diff --git a/code/modules/modular_computers/file_system/programs/command/synth_requester.dm b/code/modules/modular_computers/file_system/programs/command/synth_requester.dm new file mode 100644 index 000000000000..a71e0bc474ce --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/command/synth_requester.dm @@ -0,0 +1,173 @@ +#define SECURITY "sec" +#define MEDICAL "med" +#define ENGINEERING "eng" +#define SCIENCE "sci" +#define SUPPLY "sup" + +GLOBAL_LIST_INIT(granted_synthetic_access, list()) + +/datum/computer_file/program/synth_requester + filename = "synth_req" + filedesc = "Synthetic Manager" + category = PROGRAM_CATEGORY_CMD + program_icon_state = "id" + extended_desc = "Program for requesting synthetic assistance and granting departmental access." + transfer_access = ACCESS_HEADS + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET | PROGRAM_PHONE | PROGRAM_PDA + size = 4 + tgui_id = "NtosSynthManager" + program_icon = "address-book" + +/datum/computer_file/program/synth_requester/ui_act(action, params, datum/tgui/ui) + if(..()) + return + + var/mob/user = usr + var/obj/item/card/id/user_id = user.get_idcard() + computer.play_interact_sound() + if(user_id) + if(!(ACCESS_HEADS in user_id.access)) + return + + + switch(action) + if("grant_science") + if(ACCESS_RD in user_id.access) + var/relevant_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_ROBO_CONTROL, ACCESS_TELEPORTER, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS) + if(GLOB.granted_synthetic_access[SCIENCE]) + GLOB.granted_synthetic_access[SCIENCE] = FALSE + binary_talk("Synthetic assistance no longer required in the Science department", "Synthetic Access Requester") + GLOB.synthetic_added_access -= relevant_access + else + var/reason = tgui_input_text(user, "Please provide a reason for requesting synthetic assistance.", "Assistance Request") + if(!reason) + return FALSE + binary_talk("Synthetic assistance required in the Science department for the following reason: [reason]", "Synthetic Access Requester") + GLOB.granted_synthetic_access[SCIENCE] = TRUE + GLOB.synthetic_added_access |= relevant_access + + return TRUE + if("grant_supply") + if(ACCESS_HOP in user_id.access) + var/relevant_access = list(ACCESS_CARGO, ACCESS_QM, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) + if(GLOB.granted_synthetic_access[SUPPLY]) + GLOB.granted_synthetic_access[SUPPLY] = FALSE + binary_talk("Synthetic assistance no longer required in the Supply department", "Synthetic Access Requester") + GLOB.synthetic_added_access -= relevant_access + else + var/reason = tgui_input_text(user, "Please provide a reason for requesting synthetic assistance.", "Assistance Request") + if(!reason) + return FALSE + binary_talk("Synthetic assistance required in the Supply department for the following reason: [reason]", "Synthetic Access Requester") + GLOB.granted_synthetic_access[SUPPLY] = TRUE + GLOB.synthetic_added_access |= relevant_access + + + return TRUE + if("grant_engi") + if(ACCESS_CE in user_id.access) + var/relevant_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_ATMOSPHERICS, ACCESS_CONSTRUCTION, ACCESS_SECURE_TECH_STORAGE) + if(GLOB.granted_synthetic_access[ENGINEERING]) + GLOB.granted_synthetic_access[ENGINEERING] = FALSE + binary_talk("Synthetic assistance no longer required in the Engineering department", "Synthetic Access Requester") + GLOB.synthetic_added_access -= relevant_access + else + var/reason = tgui_input_text(user, "Please provide a reason for requesting synthetic assistance.", "Assistance Request") + if(!reason) + return FALSE + binary_talk("Synthetic assistance required in the Engineering department for the following reason: [reason]", "Synthetic Access Requester") + GLOB.granted_synthetic_access[ENGINEERING] = TRUE + GLOB.synthetic_added_access |= relevant_access + + return TRUE + if("grant_security") + if(ACCESS_HOS in user_id.access) + var/relevant_access = list(ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS, ACCESS_BRIG_PHYS) + if(GLOB.granted_synthetic_access[SECURITY]) + GLOB.granted_synthetic_access[SECURITY] = FALSE + binary_talk("Synthetic assistance no longer required in the Security department", "Synthetic Access Requester") + GLOB.synthetic_added_access -= relevant_access + else + var/reason = tgui_input_text(user, "Please provide a reason for requesting synthetic assistance.", "Assistance Request") + if(!reason) + return FALSE + binary_talk("Synthetic assistance required in the Security department for the following reason: [reason]", "Synthetic Access Requester") + GLOB.granted_synthetic_access[SECURITY] = TRUE + GLOB.synthetic_added_access |= relevant_access + + return TRUE + if("grant_medical") + if(ACCESS_CMO in user_id.access) + var/relevant_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_PARAMEDIC, ACCESS_PSYCH) + if(GLOB.granted_synthetic_access[MEDICAL]) + GLOB.granted_synthetic_access[MEDICAL] = FALSE + binary_talk("Synthetic assistance no longer required in the Medical department", "Synthetic Access Requester") + GLOB.synthetic_added_access -= relevant_access + else + var/reason = tgui_input_text(user, "Please provide a reason for requesting synthetic assistance.", "Assistance Request") + if(!reason) + return FALSE + binary_talk("Synthetic assistance required in the Medical department for the following reason: [reason]", "Synthetic Access Requester") + GLOB.granted_synthetic_access[MEDICAL] = TRUE + GLOB.synthetic_added_access |= relevant_access + return TRUE + + +/datum/computer_file/program/synth_requester/ui_data(mob/user) + var/list/data = get_header_data() + + data["granted_access"] = list(GLOB.granted_synthetic_access) + + var/obj/item/card/id/user_id = user.get_idcard() + + if(ACCESS_CMO in user_id.access) + data["cmo"] = TRUE + if(ACCESS_HOS in user_id.access) + data["hos"] = TRUE + if(ACCESS_RD in user_id.access) + data["rd"] = TRUE + if(ACCESS_HOP in user_id.access) + data["hop"] = TRUE + if(ACCESS_CE in user_id.access) + data["ce"] = TRUE + + return data + +/proc/binary_talk(message,name, loud = TRUE) + + var/spans = "[SPAN_ROBOT]" + + + if(loud) + // AIs are loud and ugly + spans += " [SPAN_COMMAND]" + + var/quoted_message = "states, \"[message]\"" + + for(var/mob/M in GLOB.player_list) + if(M.binarycheck()) + to_chat( + M, + span_binarysay("\ + Robotic Talk, \ + [span_name("[name]")] [span_message("[quoted_message]")]\ + ") + ) + + if(isobserver(M)) + // If the AI talks on binary chat, we still want to follow + // its camera eye, like if it talked on the radio + + to_chat( + M, + span_binarysay("\ + Robotic Talk, \ + [span_name("[name]")] [span_message("[quoted_message]")]\ + ") + ) + +#undef SECURITY +#undef MEDICAL +#undef ENGINEERING +#undef SCIENCE +#undef SUPPLY diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 00b540b798a2..a78819409b57 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -192,7 +192,7 @@ "installed" = !!hard_drive.find_file_by_name(P.filename), "compatible" = check_compatibility(P), "size" = P.size, - "access" = emagged && P.available_on_syndinet ? TRUE : P.can_run(user,transfer = 1, access = access), + "access" = emagged ? TRUE : P.can_run(user,transfer = 1, access = access), "verifiedsource" = P.available_on_ntnet, )) diff --git a/code/modules/modular_computers/file_system/programs/ntpda_msg.dm b/code/modules/modular_computers/file_system/programs/ntpda_msg.dm index 52686e46c1d6..87c591afde9b 100644 --- a/code/modules/modular_computers/file_system/programs/ntpda_msg.dm +++ b/code/modules/modular_computers/file_system/programs/ntpda_msg.dm @@ -60,8 +60,8 @@ GLOBAL_LIST_EMPTY(NTPDAMessages) if(source) explosion(source, -1, 0, 3, 4) - if(!QDELETED(source) && source.obj_integrity > source.integrity_failure) // Ensure the screen breaks - source.take_damage(source.obj_integrity - source.integrity_failure, BRUTE, "", TRUE, null, 100) // 100 armor pen + if(!QDELETED(source) && source.get_integrity() > source.integrity_failure) // Ensure the screen breaks + source.take_damage(source.get_integrity() - source.integrity_failure, BRUTE, "", TRUE, null, 100) // 100 armor pen else throw EXCEPTION("No computer or hard drive to detonate!") diff --git a/code/modules/modular_computers/file_system/programs/paperworkprinter.dm b/code/modules/modular_computers/file_system/programs/paperworkprinter.dm index b97f58a4afb7..6d560c92f3c2 100644 --- a/code/modules/modular_computers/file_system/programs/paperworkprinter.dm +++ b/code/modules/modular_computers/file_system/programs/paperworkprinter.dm @@ -8,7 +8,7 @@ requires_ntnet = FALSE size = 4 tgui_id = "NtosPaperworkPrinter" - program_icon = "clipboard-list" + program_icon = "file" /datum/computer_file/program/paperwork_printer/ui_static_data(mob/user) var/list/data = get_header_data() diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 6f42edf88f70..4392f850bc92 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -137,7 +137,7 @@ var/turf/there = get_turf(signal) if(!here || !there) return FALSE //I was still getting a runtime even after the above check while scanning, so fuck it - return (there.z == here.z) || (is_station_level(here.z) && is_station_level(there.z)) + return (there.z in SSmapping.get_connected_levels(here)) /** * @@ -256,19 +256,16 @@ objects += list(crewinfo) /datum/computer_file/program/radar/lifeline/trackable(mob/living/carbon/human/humanoid) - var/nanite_sensors = FALSE - if(humanoid in SSnanites.nanite_monitored_mobs) - nanite_sensors = TRUE if(!humanoid || !istype(humanoid)) return FALSE - if(..() && (istype(humanoid.w_uniform, /obj/item/clothing/under) || nanite_sensors)) - if(!nanite_sensors) - + if(..()) + if(HAS_TRAIT(humanoid, TRAIT_SUITLESS_SENSORS)) + return TRUE + if(istype(humanoid.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/uniform = humanoid.w_uniform - if(!uniform.has_sensor || (uniform.sensor_mode < SENSOR_COORDS)) // Suit sensors must be on maximum. - return FALSE - - return TRUE + if(uniform.has_sensor && uniform.sensor_mode >= SENSOR_COORDS) // Suit sensors must be on maximum + return TRUE + return FALSE //////////////////////// //Nuke Disk Finder App// diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 05ba093d4cff..3c1bb0eb56a3 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -49,12 +49,12 @@ // Cable coil. Works as repair method, but will probably require multiple applications and more cable. if(istype(I, /obj/item/stack/cable_coil)) var/obj/item/stack/S = I - if(obj_integrity == max_integrity) + if(atom_integrity == max_integrity) to_chat(user, span_warning("\The [src] doesn't seem to require repairs.")) return 1 if(S.use(1)) to_chat(user, span_notice("You patch up \the [src] with a bit of \the [I].")) - obj_integrity = min(obj_integrity + 10, max_integrity) + update_integrity(min(atom_integrity + 10, max_integrity)) return 1 if(try_insert(I, user)) diff --git a/code/modules/modular_computers/hardware/aiinterface.dm b/code/modules/modular_computers/hardware/aiinterface.dm new file mode 100644 index 000000000000..214bbad5f548 --- /dev/null +++ b/code/modules/modular_computers/hardware/aiinterface.dm @@ -0,0 +1,43 @@ +/obj/item/computer_hardware/ai_interface + name = "portable AI network interface" + desc = "A module allowing this computer to interface with local AI networks. Only works with portable computers" + power_usage = 15 //W + icon_state = "card_mini" + w_class = WEIGHT_CLASS_SMALL // Can't be installed into tablets/PDAs + device_type = MC_AI_NETWORK + expansion_hw = TRUE + + var/obj/structure/ethernet_cable/connected_cable = null + + +// Called when component is installed into PC. +/obj/item/computer_hardware/ai_interface/on_install(obj/item/modular_computer/M, mob/living/user = null) + RegisterSignal(M, COMSIG_MOVABLE_MOVED, PROC_REF(parent_moved)) + + +/obj/item/computer_hardware/ai_interface/on_remove(obj/item/modular_computer/M, mob/living/user = null) + UnregisterSignal(M, COMSIG_MOVABLE_MOVED) + connected_cable = null + +/obj/item/computer_hardware/ai_interface/proc/parent_moved() + if(connected_cable) + if(!connected_cable.Adjacent(holder.physical.loc)) + connected_cable = null + if(ismob(holder.physical.loc)) + to_chat(holder.physical.loc, span_warning("You disconnect [holder] from the cable!")) + +/obj/item/computer_hardware/ai_interface/proc/connect_cable(obj/structure/ethernet_cable/EC) + connected_cable = EC + + +/obj/item/computer_hardware/ai_interface/proc/get_network() + if(!connected_cable) + return FALSE + return connected_cable.network + + +/obj/item/computer_hardware/ai_interface/can_install(obj/item/modular_computer/M, mob/living/user = null) + if(!ismachinery(M.physical) && !M.physical.anchored) + return ..() + to_chat(user, span_warning("\The [src] is incompatible with stationary computers!")) + return FALSE diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index a505203c15c1..2377d1e521a1 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -77,6 +77,8 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user H.sec_hud_set_ID() + + holder.update_appearance(UPDATE_ICON) return TRUE @@ -92,6 +94,7 @@ to_chat(user, "You remove the card from \the [src].") playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + holder?.update_appearance(UPDATE_ICON) return TRUE /obj/item/computer_hardware/card_slot/attackby(obj/item/I, mob/living/user) diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 7ff912f3cead..f14950be589e 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -85,8 +85,7 @@ stored_files -= file_removing recalculate_size() return TRUE - else - return FALSE + return FALSE // Loops through all stored files and recalculates used_capacity of this drive /obj/item/computer_hardware/hard_drive/proc/recalculate_size() @@ -115,8 +114,7 @@ return FALSE if((used_capacity + file_storing.size) > max_capacity) return FALSE - else - return TRUE + return TRUE // Tries to find the file by filename. Returns null on failure diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 071c3aeafcd8..6836f3b3d06c 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -58,7 +58,7 @@ /obj/item/energy_katana/pickup(mob/living/carbon/human/user) . = ..() if(!is_ninja(user)) //stolen directly from the bloody bastard sword - if(user.electrocute_act(15, src, 1, user.held_index_to_body_zone(user.active_hand_index))) // you tried to grab it with this hand, so we'll shock it + if(user.electrocute_act(15, src, 1, user.held_index_to_hand(user.active_hand_index))) // you tried to grab it with this hand, so we'll shock it to_chat(user, span_userdanger("[src] shocks you!")) user.emote("scream") user.dropItemToGround(src, TRUE) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 50396085a551..be29a37de1e6 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -18,6 +18,9 @@ density = TRUE anchored = TRUE + /// List of allowed item types + var/allowed_types = list(/obj/item/paper, /obj/item/folder, /obj/item/photo, /obj/item/documents, /obj/item/clipboard, /obj/item/tape) + /obj/structure/filingcabinet/chestdrawer name = "chest drawer" icon_state = "chestdrawer" @@ -71,7 +74,7 @@ update_appearance(UPDATE_ICON) if(mapload) for(var/obj/item/I in loc) - if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo)) + if(is_type_in_list(I, allowed_types)) I.forceMove(src) /obj/structure/filingcabinet/deconstruct(disassembled = TRUE) @@ -89,7 +92,7 @@ else name = initial(name) return - if(istype(P, /obj/item/paper) || istype(P, /obj/item/folder) || istype(P, /obj/item/photo) || istype(P, /obj/item/documents) || istype(P, /obj/item/clipboard)) + if(is_type_in_list(P, allowed_types)) if(!user.transferItemToLoc(P, src)) return to_chat(user, span_notice("You put [P] in [src].")) diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index d176edb1d1c0..deb550b297d2 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -1,5 +1,5 @@ /obj/machinery/papershredder - name = "Paper Shredder" + name = "paper shredder" desc = "Disposes of papers you don't want seen, as well as IDs that are no longer needed." icon = 'icons/obj/bureaucracy.dmi' icon_state = "papershredder0" diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index f41efbc4633f..397b0e73fce9 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -93,21 +93,14 @@ updateUsrDialog() else if(ass) //ASS COPY. By Miauw for(var/i = 0, i < copies, i++) - var/icon/temp_img if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) to_chat(usr, span_notice("You feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on.") ) // ' break else if(toner >= 5 && !busy && check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. - if(isalienadult(ass) || istype(ass, /mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. - temp_img = icon('icons/ass/assalien.png') - else if(ishuman(ass)) //Suit checks are in check_ass - temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') - if(iscatperson(ass)) - temp_img = icon('icons/ass/asscat.png') - else if(isdrone(ass)) //Drones are hot - temp_img = icon('icons/ass/assdrone.png') - else + var/butt_icon_state = ass.get_butt_sprite() + if(isnull(butt_icon_state)) break + var/icon/temp_img = icon('icons/mob/butts.dmi', butt_icon_state) busy = TRUE sleep(1.5 SECONDS) var/obj/item/photo/p = new /obj/item/photo (loc) @@ -232,7 +225,7 @@ else return ..() -/obj/machinery/photocopier/obj_break(damage_flag) +/obj/machinery/photocopier/atom_break(damage_flag) . = ..() if(. && toner > 0) new /obj/effect/decal/cleanable/oil(get_turf(src)) @@ -272,8 +265,8 @@ updateUsrDialog() /obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. - if(!ass) - return 0 + if(!isliving(ass)) + return FALSE if(ass.loc != src.loc) ass = null updateUsrDialog() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index d631597a03b3..cfae28b0aa25 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -207,6 +207,7 @@ name = "[area.name] APC" stat |= MAINT addtimer(CALLBACK(src, PROC_REF(update)), 5) + update_appearance(UPDATE_ICON) /obj/machinery/power/apc/Destroy() GLOB.apcs_list -= src @@ -242,6 +243,8 @@ /obj/machinery/power/apc/Initialize(mapload) . = ..() + if(!mapload) + return has_electronics = APC_ELECTRONICS_SECURED // is starting with a power cell installed, create it and set its charge level if(cell_type) @@ -706,7 +709,7 @@ to_chat(user, span_warning("[src] has both electronics and a cell.")) return else if (istype(W, /obj/item/wallframe/apc) && opened) - if (!(stat & BROKEN || opened==APC_COVER_REMOVED || obj_integrity < max_integrity)) // There is nothing to repair + if (!(stat & BROKEN || opened==APC_COVER_REMOVED || atom_integrity < max_integrity)) // There is nothing to repair to_chat(user, span_warning("You found no reason for repairing this APC")) return if (!(stat & BROKEN) && opened==APC_COVER_REMOVED) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover @@ -727,7 +730,7 @@ to_chat(user, span_notice("You replace the damaged APC frame with a new one.")) qdel(W) stat &= ~BROKEN - obj_integrity = max_integrity + update_integrity(max_integrity) if (opened==APC_COVER_REMOVED) opened = APC_COVER_OPENED update_appearance() @@ -857,13 +860,13 @@ last_light_switch = world.time set_nightshift(!nightshift_lights) -/obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/obj/machinery/power/apc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) if(damage_flag == MELEE && damage_amount < 10 && (!(stat & BROKEN) || malfai)) return 0 . = ..() -/obj/machinery/power/apc/obj_break(damage_flag) +/obj/machinery/power/apc/atom_break(damage_flag) . = ..() if(.) set_broken() @@ -1125,6 +1128,18 @@ return FALSE _try_interact(user) +/obj/machinery/power/apc/attack_ai(mob/user) + if(!isAI(user)) + return ..() + + var/mob/living/silicon/ai/AI = user + if(AI.has_subcontroller_connection(get_area(src))) + return ..() + + to_chat(AI, span_warning("No connection to subcontroller detected. Polling APC...")) + if(do_after(AI, 1 SECONDS, src, IGNORE_USER_LOC_CHANGE)) + return ..() + /obj/machinery/power/apc/proc/toggle_breaker(mob/user) if(!is_operational() || failure_timer) return @@ -1483,7 +1498,7 @@ if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) operating = FALSE - obj_break() + atom_break() if(occupier) malfvacate(1) update() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 6747f04952d6..04d1cc676e0a 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -27,6 +27,8 @@ By design, d1 is the smallest direction and d2 is the highest desc = "A flexible, superconducting insulated cable for heavy-duty power transfer." icon = 'icons/obj/power_cond/cables.dmi' icon_state = "0-1" + ///Yogs, Biome wanted cables above pipes + //plane = FLOOR_PLANE layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE obj_flags = CAN_BE_HIT | ON_BLUEPRINTS @@ -89,7 +91,11 @@ By design, d1 is the smallest direction and d2 is the highest cable_color = param_color || cable_color || pick(cable_colors) if(cable_colors[cable_color]) cable_color = cable_colors[cable_color] + return INITIALIZE_HINT_LATELOAD + +/obj/structure/cable/LateInitialize() update_appearance(UPDATE_ICON) + //is_fully_initialized = TRUE /obj/structure/cable/Destroy() // called when a cable is deleted if(powernet) @@ -605,7 +611,7 @@ By design, d1 is the smallest direction and d2 is the highest return if(!isturf(T) || T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) - to_chat(user, span_warning("You can only lay cables on catwalks and plating!")) + to_chat(user, span_warning("You can only lay cables on top of exterior catwalks and plating!")) return if(get_amount() < 1) // Out of cable @@ -625,6 +631,7 @@ By design, d1 is the smallest direction and d2 is the highest else dirn = dirnew + for(var/obj/structure/cable/LC in T) if(LC.d2 == dirn && LC.d1 == 0) to_chat(user, span_warning("There's already a cable at that position!")) @@ -667,7 +674,7 @@ By design, d1 is the smallest direction and d2 is the highest var/turf/T = C.loc if(!isturf(T) || T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) - to_chat(user, span_warning("You can only lay cables on catwalks and plating!")) + to_chat(user, span_warning("You can only lay cables on top of exterior catwalks and plating!")) return if(get_amount() < 1) // Out of cable diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm index 35e2e402e8ea..f5799bdd8c4d 100644 --- a/code/modules/power/floodlight.dm +++ b/code/modules/power/floodlight.dm @@ -108,7 +108,7 @@ change_setting(current, user) ..() -/obj/machinery/power/floodlight/obj_break(damage_flag) +/obj/machinery/power/floodlight/atom_break(damage_flag) . = ..() if(!.) return diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 7b44b81f1f07..243ab88bf3ee 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -296,7 +296,7 @@ cold_circ.update_appearance(UPDATE_ICON) cold_circ = null -/obj/machinery/power/generator/obj_break(damage_flag) +/obj/machinery/power/generator/atom_break(damage_flag) kill_circs() ..() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 1e334473ef6b..bc59965043dd 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne qdel(src) /obj/machinery/gravity_generator/proc/set_broken() - obj_break() + atom_break() /obj/machinery/gravity_generator/proc/set_fix() stat &= ~BROKEN @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/obj/machinery/gravity_generator/main/main_part /obj/machinery/gravity_generator/part/Destroy() - obj_break() + atom_break() if(main_part) UnregisterSignal(main_part, COMSIG_ATOM_UPDATED_ICON) main_part = null diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 63a2fb57bcf2..fe62eb47fa82 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -287,6 +287,9 @@ ///More stress stuff. var/turning_on = FALSE + ///Flicker cooldown + COOLDOWN_DECLARE(flicker_cooldown) + /obj/machinery/light/broken status = LIGHT_BROKEN icon_state = "tube-broken" @@ -353,9 +356,6 @@ // Light projects out backwards from the dir of the light set_light(l_dir = REVERSE_DIR(dir)) - if(mapload && our_area.lights_always_start_on) - turn_on(trigger = FALSE, quiet = TRUE) - return INITIALIZE_HINT_LATELOAD /obj/machinery/light/LateInitialize() @@ -654,7 +654,7 @@ newlight.setDir(dir) newlight.stage = current_stage if(!disassembled) - newlight.obj_integrity = newlight.max_integrity * 0.5 + newlight.update_integrity(newlight.max_integrity * 0.5) if(status != LIGHT_BROKEN) break_light_tube() if(status != LIGHT_EMPTY) @@ -729,8 +729,9 @@ /obj/machinery/light/proc/flicker(amount = rand(10, 20)) set waitfor = 0 - if(flickering) + if(flickering || !COOLDOWN_FINISHED(src, flicker_cooldown)) return + COOLDOWN_START(src, flicker_cooldown, 10 SECONDS) flickering = 1 if(on && status == LIGHT_OK) for(var/i = 0; i < amount; i++) @@ -1024,7 +1025,7 @@ ..() shatter() -/obj/item/light/attack_obj(obj/O, mob/living/user) +/obj/item/light/attack_atom(obj/O, mob/living/user) ..() shatter() @@ -1075,9 +1076,9 @@ transfer_fingerprints_to(M) qdel(src) -/proc/flicker_all_lights() +/proc/flicker_all_lights() //not QUITE all lights, but it reduces lag for(var/obj/machinery/light/L in GLOB.machines) - if(is_station_level(L.z)) + if(is_station_level(L.z) && prob(50)) addtimer(CALLBACK(L, TYPE_PROC_REF(/obj/machinery/light, flicker), rand(3, 6)), rand(0, 15)) #undef LIGHT_ON_DELAY_UPPER diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index ba5cbaac4108..0ed04f1e3537 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -346,7 +346,7 @@ //dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.) //zone_override - allows checking a specific body part for shock protection instead of the hands //No animations will be performed by this proc. -/proc/electrocute_mob(mob/living/carbon/victim, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE, zone = BODY_ZONE_R_ARM) +/proc/electrocute_mob(mob/living/carbon/victim, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE, zone = HANDS) if(!istype(victim) || ismecha(victim.loc)) return FALSE //feckin mechs are dumb @@ -408,6 +408,14 @@ return C return null +/turf/proc/get_ai_cable_node() + if(!can_have_cabling()) + return null + for(var/obj/structure/ethernet_cable/C in src) + if(C.d1 == 0) + return C + return null + /area/proc/get_apc() for(var/obj/machinery/power/apc/APC in GLOB.apcs_list) if(APC.area == src) diff --git a/code/modules/power/reactor/reactor.dm b/code/modules/power/reactor/reactor.dm index 3819a4d72a5e..40610af3c359 100644 --- a/code/modules/power/reactor/reactor.dm +++ b/code/modules/power/reactor/reactor.dm @@ -78,7 +78,7 @@ if(isnull(id)) id = getnewid() -/obj/machinery/atmospherics/components/trinary/nuclear_reactor/proc/get_integrity() +/obj/machinery/atmospherics/components/trinary/nuclear_reactor/get_integrity() return round(100 * vessel_integrity / initial(vessel_integrity), 0.01) /obj/machinery/atmospherics/components/trinary/nuclear_reactor/examine(mob/user) @@ -175,12 +175,15 @@ to_chat(user, span_notice("The reactor has no fuel rods!")) return TRUE var/obj/item/fuel_rod/rod = tgui_input_list(usr, "Select a fuel rod to remove", "Fuel Rods", fuel_rods) - if(rod && istype(rod) && I.use_tool(src, user, removal_time)) + if(rod && istype(rod) && I.use_tool(src, user, removal_time, volume=50)) if(temperature > REACTOR_TEMPERATURE_MINIMUM) var/turf/T = get_turf(src) T.atmos_spawn_air("water_vapor=[pressure/100];TEMP=[temperature]") user.rad_act(rod.fuel_power * 1000) fuel_rods.Remove(rod) + if(ismecha(user.loc)) + rod.forceMove(get_step(get_turf(user.loc), user.loc.dir)) + return TRUE if(!user.put_in_hands(rod)) rod.forceMove(user.loc) return TRUE diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index dfd62b2a5912..80c515e039c3 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -273,7 +273,7 @@ else if(mode == MONEY) . += "[src]'s display displays the words: \"Money production mode. Please insert Plasma. Use a multitool to change production modes.\"" -/obj/machinery/power/rad_collector/obj_break(damage_flag) +/obj/machinery/power/rad_collector/atom_break(damage_flag) . = ..() if(.) eject() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 5b0faf3e0855..6d3bdc6fe904 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -16,6 +16,13 @@ var/obj/machinery/field/generator/FG1 = null var/obj/machinery/field/generator/FG2 = null +/obj/machinery/field/containment/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/machinery/field/containment/Destroy() FG1.fields -= src FG2.fields -= src @@ -57,8 +64,7 @@ else ..() -/obj/machinery/field/containment/Crossed(atom/movable/AM) - . = ..() +/obj/machinery/field/containment/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM)) shock(AM) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index b328d36525a3..5d68f0301b9b 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -94,7 +94,7 @@ return priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: 30 SECONDS.","Central Command Higher Dimensional Affairs") sleep(5 SECONDS) - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) SSshuttle.registerHostileEnvironment(GLOB.cult_narsie) SSshuttle.lockdown = TRUE sleep(25 SECONDS) @@ -102,7 +102,7 @@ priority_announce("Nuclear detonation has been aborted due to termination of event. Please note that further damage to corporate property will not be tolerated.","Central Command Higher Dimensional Affairs", 'sound/misc/notice1.ogg') GLOB.cult_narsie = null sleep(2 SECONDS) - set_security_level("red") + SSsecurity_level.set_level(SEC_LEVEL_RED) SSshuttle.clearHostileEnvironment() SSshuttle.lockdown = FALSE INVOKE_ASYNC(GLOBAL_PROC, PROC_REF(cult_ending_helper), 2) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 33a0bf6eeac7..97f453d53b61 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -58,7 +58,7 @@ break dir_loop if(!terminal) - obj_break() + atom_break() return terminal.master = src update_appearance(UPDATE_ICON) @@ -202,7 +202,7 @@ if(terminal) terminal.master = null terminal = null - obj_break() + atom_break() /obj/machinery/power/smes/update_overlays() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 82412f16069c..bbc9351bab38 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -65,7 +65,7 @@ multiplier = S.multiplier max_integrity *= S.integmultiplier - obj_integrity = max_integrity + update_integrity(max_integrity) panelcolor = S.panelcolor glass_type = S.glass_type @@ -89,7 +89,7 @@ playsound(loc, 'sound/items/welder.ogg', 100, 1) -/obj/machinery/power/solar/obj_break(damage_flag) +/obj/machinery/power/solar/atom_break(damage_flag) . = ..() if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) @@ -484,7 +484,7 @@ if(BURN) playsound(src.loc, 'sound/items/welder.ogg', 100, 1) -/obj/machinery/power/solar_control/obj_break(damage_flag) +/obj/machinery/power/solar_control/atom_break(damage_flag) . = ..() if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index e118d46e80a6..bf6902b961ef 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -292,7 +292,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(SUPERMATTER_WARNING) playsound(src, 'sound/machines/supermatter_alert.ogg', 75, FALSE, pressure_affected=FALSE) -/obj/machinery/power/supermatter_crystal/proc/get_integrity() +/obj/machinery/power/supermatter_crystal/get_integrity() var/integrity = damage / explosion_point integrity = round(100 - integrity * 100, 0.01) integrity = integrity < 0 ? 0 : integrity @@ -347,7 +347,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) resonance_cascading = TRUE sound_to_playing_players('sound/magic/lightning_chargeup.ogg', 50, FALSE) // yogs end if(supermatter_blob) - priority_announce("LEVEL 5 BIOHAZARD OUTBREAK IMMINENT.", "Anomaly Alert", 'sound/misc/notice1.ogg') + if(!check_containment(src, 5)) + priority_announce("LEVEL 5 BIOHAZARD OUTBREAK IMMINENT.", "Anomaly Alert", 'sound/misc/notice1.ogg', color_override="yellow") + else + priority_announce("LEVEL 5 CONTROLLED BIOHAZARD CONTAINMENT IMMINENT. ESTABLISHING RESEARCH NODES AROUND CONTAINMENT FIELDS.", "Anomaly Alert", 'sound/misc/notice1.ogg', color_override="green") else if(corruptor_attached) speaking = "[round(i*0.1*rand(),1)]..." @@ -508,7 +511,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) else powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05,0, 1) - if(support_integrity >= 10 && !supermatter_blob) + if(support_integrity >= 10 && (!supermatter_blob || check_containment(src, 5))) powerloss_inhibitor = clamp(1-(powerloss_dynamic_scaling * clamp(combined_gas/POWERLOSS_INHIBITION_MOLE_BOOST_THRESHOLD,1 ,1.5)),0 ,1) if(matter_power) @@ -556,6 +559,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if (miasmacomp >= 0.5 && miasmol > 500 && !supermatter_blob) //requires around 4500 mol of miasma for the blob supermatter_blob = TRUE // you are fucked + damage += 50 + supermatter_zap(src, 10, 7000) // adding enough hypernoblium can save it, but only if it hasn't gotten too bad and it wasn't corrupted using the traitor kit if(nobliumcomp >= 0.5 && antinoblium_attached && !corruptor_attached && support_integrity > 10 && damage <= damage_archived) @@ -621,15 +626,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) supermatter_zap(src, 5, clamp(power*2, 4000, 20000)) - if(prob(15) && (power > POWER_PENALTY_THRESHOLD || combined_gas > MOLE_PENALTY_THRESHOLD || antinoblium_attached || supermatter_blob)) + if(prob(15) && (power > POWER_PENALTY_THRESHOLD || combined_gas > MOLE_PENALTY_THRESHOLD || antinoblium_attached || (supermatter_blob && !check_containment(src, 5)))) supermatter_pull(src, power/750) - if(prob(5) || (antinoblium_attached || supermatter_blob) && prob(10)) + if(prob(5) || (antinoblium_attached || (supermatter_blob && !check_containment(src, 5))) && prob(10)) supermatter_anomaly_gen(src, ANOMALY_FLUX, rand(5, 10)) - if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(5) || prob(1) || (antinoblium_attached || supermatter_blob) && prob(10)) + if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(5) || prob(1) || (antinoblium_attached || (supermatter_blob && !check_containment(src, 5))) && prob(10)) supermatter_anomaly_gen(src, ANOMALY_GRAVITATIONAL, rand(5, 10)) - if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(2) || prob(0.3) && power > POWER_PENALTY_THRESHOLD || (antinoblium_attached || supermatter_blob) && prob(10)) + if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(2) || prob(0.3) && power > POWER_PENALTY_THRESHOLD || (antinoblium_attached || (supermatter_blob && !check_containment(src, 5))) && prob(10)) supermatter_anomaly_gen(src, ANOMALY_PYRO, rand(5, 10)) - if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(5) || prob(0.5) || (antinoblium_attached || supermatter_blob) && prob(10)) + if(power > SEVERE_POWER_PENALTY_THRESHOLD && prob(5) || prob(0.5) || (antinoblium_attached || (supermatter_blob && !check_containment(src, 5))) && prob(10)) supermatter_anomaly_gen(src, ANOMALY_RADIATION, rand(5, 10)) if(damage > warning_point) // while the core is still damaged and it's still worth noting its status @@ -684,9 +689,14 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) investigate_log("The supermatter crystal: Warning: Critical coolant mass reached.", INVESTIGATE_SUPERMATTER) // yogs end if(supermatter_blob) - radio.talk_into(src, "DANGER: BIOHAZARD DETECTED, VACATE THE CHAMBER IMMEDIATELY.", engineering_channel) - log_game("The supermatter crystal: DANGER: BIOHAZARD DETECTED, VACATE THE CHAMBER IMMEDIATELY.") // yogs start - Logs SM chatter - investigate_log("The supermatter crystal: DANGER: BIOHAZARD DETECTED, VACATE THE CHAMBER IMMEDIATELY.", INVESTIGATE_SUPERMATTER) // yogs end + if(!check_containment(src, 5)) + radio.talk_into(src, "DANGER: BIOHAZARD DETECTED, VACATE THE CHAMBER IMMEDIATELY.", engineering_channel) + log_game("The supermatter crystal: DANGER: BIOHAZARD DETECTED, VACATE THE CHAMBER IMMEDIATELY.") // yogs start - Logs SM chatter + investigate_log("The supermatter crystal: DANGER: BIOHAZARD DETECTED, VACATE THE CHAMBER IMMEDIATELY.", INVESTIGATE_SUPERMATTER) // yogs end + else + radio.talk_into(src, "WARNING: CONTROLLED BIOHAZARD DETECTED, PROCEED WITH CAUTION.", engineering_channel) + log_game("The supermatter crystal: WARNING: CONTROLLED BIOHAZARD DETECTED, PROCEED WITH CAUTION.") // yogs start - Logs SM chatter + investigate_log("The supermatter crystal: WARNING: CONTROLLED BIOHAZARD DETECTED, PROCEED WITH CAUTION.", INVESTIGATE_SUPERMATTER) // yogs end if(damage >= emergency_point) radio.talk_into(src, "DANGER: SUPERMATTER BIOHAZARD LEVELS HAVE EXCEEDED SAFETY THRESHOLDS.", common_channel) log_game("DANGER: SUPERMATTER BIOHAZARD LEVELS HAVE EXCEEDED SAFETY THRESHOLDS.") // yogs start - Logs SM chatter @@ -707,20 +717,21 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //blob SM HAMMM if(supermatter_blob) - powerloss_inhibitor = 0.01 - power += 10000 - if(prob(30)) - radiation_pulse(src, 5000, 4) - pulsewave() - T.hotspot_expose(max(500+FIRE_MINIMUM_TEMPERATURE_TO_EXIST,T.return_air().return_temperature()), 100) - playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) - supermatter_zap(src, 5, power) - for(var/i = 1 to 20) - fire_nuclear_particle() + if(!check_containment(src, 5)) + powerloss_inhibitor = 0.01 + power += 10000 + if(prob(2)) + empulse(src, 10, 5) + if(prob(30)) + radiation_pulse(src, 5000, 4) + pulsewave() + T.hotspot_expose(max(500+FIRE_MINIMUM_TEMPERATURE_TO_EXIST,T.return_air().return_temperature()), 100) + playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) + supermatter_zap(src, 5, power) + for(var/i = 1 to 20) + fire_nuclear_particle() if(istype(T, /turf/open/space) || T.return_air().total_moles() < MOLE_SPACE_THRESHOLD) damage += DAMAGE_HARDCAP * explosion_point - if(prob(2)) - empulse(src, 10, 5) //emagged SM go BRRRRRRR here if(antinoblium_attached && !noblium_suppressed) @@ -815,8 +826,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/blob_act(obj/structure/blob/B) if(B && !isspaceturf(loc)) //does nothing in space - damage += B.obj_integrity * 0.5 //take damage equal to 50% of remaining blob health before it tried to eat us - if(B.obj_integrity > 100) + damage += B.get_integrity() * 0.5 //take damage equal to 50% of remaining blob health before it tried to eat us + if(B.get_integrity() > 100) B.visible_message(span_danger("\The [B] strikes at \the [src] and flinches away!"),\ span_italics("You hear a loud crack as you are washed with a wave of heat.")) B.take_damage(100, BURN) diff --git a/code/modules/power/supermatter/supermatter_delamination.dm b/code/modules/power/supermatter/supermatter_delamination.dm index 0b97f5c66c31..f63eed8d5f3a 100644 --- a/code/modules/power/supermatter/supermatter_delamination.dm +++ b/code/modules/power/supermatter/supermatter_delamination.dm @@ -129,16 +129,12 @@ message_admins("The Supermatter Crystal has created an energy ball [ADMIN_JMP(supermatter_tesla)].") /datum/supermatter_delamination/proc/call_blob() - var/list/candidates = pollGhostCandidates("Do you wish to be considered for the special role of Blazing Oil Blob?", ROLE_BLOB, null, ROLE_BLOB) - if(candidates.len) - var/mob/dead/observer/new_blob = pick(candidates) - var/mob/camera/blob/BC = new_blob.become_overmind(350, 1.5, 1) - var/explosion_mod = clamp((1.001**supermatter_power) / ((1.001**supermatter_power) + SUPERMATTER_EXPLOSION_LAMBDA), 0.1, 1) - BC.set_strain(/datum/blobstrain/reagent/blazing_oil) //to protect against the fire around the blob when sm shitting itself - BC.forceMove(supermatter_turf) - BC.place_blob_core(BLOB_FORCE_PLACEMENT) + var/mob/camera/blob/BC = new /mob/camera/blob(supermatter_turf, 350, 1.5, 1) + var/explosion_mod = clamp((1.001**supermatter_power) / ((1.001**supermatter_power) + SUPERMATTER_EXPLOSION_LAMBDA), 0.1, 1) + BC.set_strain(/datum/blobstrain/reagent/blazing_oil) //to protect against the fire around the blob when sm shitting itself + BC.forceMove(supermatter_turf) + BC.place_blob_core(BLOB_FORCE_PLACEMENT) + if(!check_containment(supermatter_turf, 5)) INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(empulse), supermatter_turf, supermatter_explosion_power * explosion_mod, (supermatter_explosion_power * explosion_mod * 2) + (supermatter_explosion_power/4), TRUE, FALSE, FALSE, TRUE) - message_admins("Supermatter has created a blob. [ADMIN_JMP(BC)].") - else - supermatter_blob = FALSE - setup_delamination_type() //No blob? :( do other delams then + message_admins("Supermatter has created a Blob Overmind. [ADMIN_JMP(BC)].") + notify_ghosts("A Blob Overmind has emerged through supermatter delammination!", source=BC, action=NOTIFY_ORBIT, header="Blob Overmind") diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 495c1c6243f8..87b73998ce52 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -72,7 +72,7 @@ deconstruct(TRUE) return TRUE -/obj/machinery/power/tracker/obj_break(damage_flag) +/obj/machinery/power/tracker/atom_break(damage_flag) . = ..() if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index af78a918b9af..7e7c29df4d03 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -97,7 +97,7 @@ inturf = get_step(src, dir) locate_machinery() if(!turbine) - obj_break() + atom_break() #define COMPFRICTION 5e5 @@ -139,7 +139,7 @@ stat &= ~BROKEN else to_chat(user, span_alert("Turbine not connected.")) - obj_break() + atom_break() return default_deconstruction_crowbar(I) @@ -199,7 +199,7 @@ outturf = get_step(src, dir) locate_machinery() if(!compressor) - obj_break() + atom_break() connect_to_network() /obj/machinery/power/turbine/RefreshParts() @@ -287,7 +287,7 @@ stat &= ~BROKEN else to_chat(user, span_alert("Compressor not connected.")) - obj_break() + atom_break() return default_deconstruction_crowbar(I) diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index 3c78b00e4255..f0da3fe45dc5 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -44,9 +44,45 @@ z_offset += bounds[MAP_MAXZ] - bounds[MAP_MINZ] + 1 var/list/obj/machinery/atmospherics/atmos_machines = list() + var/list/obj/structure/ethernet_cable/ethernet_cables = list() var/list/obj/structure/cable/cables = list() + var/list/atom/movable/movables = list() + var/list/area/areas = list() var/list/atom/atoms = list() + var/list/turfs = block( + locate( + bounds[MAP_MINX], + bounds[MAP_MINY], + SSmapping.station_start + ), + locate( + bounds[MAP_MAXX], + bounds[MAP_MAXY], + z_offset - 1 + ) + ) + + for(var/turf/current_turf as anything in turfs) + var/area/current_turfs_area = current_turf.loc + areas |= current_turfs_area + + for(var/movable_in_turf in current_turf) + movables += movable_in_turf + if(istype(movable_in_turf, /obj/structure/cable)) + cables += movable_in_turf + continue + if(istype(movable_in_turf, /obj/structure/ethernet_cable)) + ethernet_cables += movable_in_turf + continue + if(istype(movable_in_turf, /obj/machinery/atmospherics)) + atmos_machines += movable_in_turf + + SSatoms.InitializeAtoms(areas + turfs + movables) + SSmachines.setup_template_powernets(cables) + SSmachines.setup_template_ainets(ethernet_cables) + SSair.setup_template_machinery(atmos_machines) + require_area_resort() var/list/generation_turfs = block( diff --git a/code/modules/projectiles/ammunition/caseless/rocket.dm b/code/modules/projectiles/ammunition/caseless/rocket.dm index e82508d2c67d..558471acd3a7 100644 --- a/code/modules/projectiles/ammunition/caseless/rocket.dm +++ b/code/modules/projectiles/ammunition/caseless/rocket.dm @@ -30,7 +30,7 @@ /obj/item/ammo_casing/caseless/bolts name = "bolts" - desc = "rods, cut in half and ready to be shot" + desc = "Rods, cut in half and ready to be shot." caliber = null icon = 'icons/obj/ammo.dmi' icon_state = "bolt" diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm index 922b950b9333..a74528a65381 100644 --- a/code/modules/projectiles/ammunition/energy/plasma.dm +++ b/code/modules/projectiles/ammunition/energy/plasma.dm @@ -5,6 +5,12 @@ delay = 15 e_cost = 25 +/obj/item/ammo_casing/energy/plasma/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + ..() + if(loc && istype(loc, /obj/item/gun/energy/plasmacutter)) + var/obj/item/gun/energy/plasmacutter/PC = loc + PC.modify_projectile(BB) + /obj/item/ammo_casing/energy/plasma/weak projectile_type = /obj/projectile/plasma/weak select_name = "weak plasma burst" diff --git a/code/modules/projectiles/ammunition/reusable/foam.dm b/code/modules/projectiles/ammunition/reusable/foam.dm index a41ba9bfe832..e825552884ad 100644 --- a/code/modules/projectiles/ammunition/reusable/foam.dm +++ b/code/modules/projectiles/ammunition/reusable/foam.dm @@ -60,6 +60,7 @@ /obj/item/ammo_casing/reusable/foam_dart/riot name = "riot foam dart" + caliber = CALIBER_FOAM_RIOT desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." projectile_type = /obj/projectile/bullet/reusable/foam_dart/riot icon_state = "foamdart_riot" diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm index 5252f4e8f61d..9b1f1b25b047 100644 --- a/code/modules/projectiles/boxes_magazines/external/toy.dm +++ b/code/modules/projectiles/boxes_magazines/external/toy.dm @@ -1,7 +1,7 @@ /obj/item/ammo_box/magazine/toy name = "foam force META magazine" - ammo_type = /obj/item/ammo_casing/reusable/foam_dart - caliber = CALIBER_FOAM + ammo_type = /obj/item/ammo_casing/reusable/foam_dart + caliber = list(CALIBER_FOAM, CALIBER_FOAM_RIOT) /obj/item/ammo_box/magazine/toy/smg name = "foam force SMG magazine" @@ -31,7 +31,7 @@ /obj/item/ammo_box/magazine/toy/smgm45 name = "donksoft SMG magazine" icon_state = "c20r45-toy" - caliber = CALIBER_FOAM + caliber = list(CALIBER_FOAM, CALIBER_FOAM_RIOT) ammo_type = /obj/item/ammo_casing/reusable/foam_dart max_ammo = 20 @@ -46,7 +46,7 @@ /obj/item/ammo_box/magazine/toy/m762 name = "donksoft box magazine" icon_state = "a762-toy" - caliber = CALIBER_FOAM + caliber = list(CALIBER_FOAM, CALIBER_FOAM_RIOT) ammo_type = /obj/item/ammo_casing/reusable/foam_dart max_ammo = 50 @@ -57,3 +57,16 @@ /obj/item/ammo_box/magazine/toy/m762/riot icon_state = "a762-riot" ammo_type = /obj/item/ammo_casing/reusable/foam_dart/riot + +//Hugboxed mags for roundstart vendors. +/obj/item/ammo_box/magazine/toy/smg/hugbox + caliber = CALIBER_FOAM + +/obj/item/ammo_box/magazine/toy/pistol/hugbox + caliber = CALIBER_FOAM + +/obj/item/ammo_box/magazine/toy/m762/hugbox + caliber = CALIBER_FOAM + +/obj/item/ammo_box/magazine/toy/smgm45/hugbox + caliber = CALIBER_FOAM \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index 1f691dd297b0..befdc5c4ab46 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -27,6 +27,11 @@ name = "double-barrel shotgun internal magazine" max_ammo = 2 +/obj/item/ammo_box/magazine/internal/shot/lethal + name = "double-barrel shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 2 + /obj/item/ammo_box/magazine/internal/shot/improvised name = "improvised shotgun internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/improvised diff --git a/code/modules/projectiles/boxes_magazines/internal/toy.dm b/code/modules/projectiles/boxes_magazines/internal/toy.dm index 717acb8c4e5d..21af490f6624 100644 --- a/code/modules/projectiles/boxes_magazines/internal/toy.dm +++ b/code/modules/projectiles/boxes_magazines/internal/toy.dm @@ -1,7 +1,14 @@ /obj/item/ammo_box/magazine/internal/shot/toy ammo_type = /obj/item/ammo_casing/reusable/foam_dart - caliber = CALIBER_FOAM + caliber = list(CALIBER_FOAM, CALIBER_FOAM_RIOT) max_ammo = 4 /obj/item/ammo_box/magazine/internal/shot/toy/crossbow max_ammo = 5 + +/obj/item/ammo_box/magazine/internal/shot/toy/hugbox + ammo_type = /obj/item/ammo_casing/reusable/foam_dart + caliber = CALIBER_FOAM + +/obj/item/ammo_box/magazine/internal/shot/toy/crossbow/hugbox + caliber = CALIBER_FOAM \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 08ed70608b5e..6d616d05ceb5 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -325,6 +325,9 @@ firing_burst = FALSE return FALSE if(chambered && chambered.BB) + if(!synth_check(user, SYNTH_RESTRICTED_WEAPON)) + return + if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. if(chambered.harmful) // Is the bullet chambered harmful? to_chat(user, span_notice(" [src] is lethally chambered! You don't want to risk harming anyone...")) @@ -386,6 +389,8 @@ addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), fire_delay * (i - 1)) else if(chambered) + if(!synth_check(user, SYNTH_RESTRICTED_WEAPON)) + return if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. if(chambered.harmful) // Is the bullet chambered harmful? to_chat(user, span_notice(" [src] is lethally chambered! You don't want to risk harming anyone...")) @@ -430,7 +435,7 @@ return ..() return -/obj/item/gun/attack_obj(obj/O, mob/user) +/obj/item/gun/attack_atom(obj/O, mob/user) if(user.a_intent == INTENT_HARM) if(bayonet) O.attackby(bayonet, user) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index fe376cebca93..5bb5f43b7c66 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -189,6 +189,9 @@ bolt_type = BOLT_TYPE_NO_BOLT can_be_sawn_off = TRUE +/obj/item/gun/ballistic/shotgun/doublebarrel/lethal + mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal + /obj/item/gun/ballistic/shotgun/doublebarrel/AltClick(mob/user) . = ..() if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index e2b9b1e3f43d..273a2d01f9c7 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -115,3 +115,28 @@ /obj/item/gun/ballistic/automatic/l6_saw/toy/update_overlays() . = ..() . += "[icon_state]_toy" + +// Hugbox'ed guns +/obj/item/gun/ballistic/automatic/toy/unrestricted/hugbox + desc = "A prototype three-round burst toy submachine gun. Ages 8 and up. This one feels noticably less fun..." + mag_type = /obj/item/ammo_box/magazine/toy/smg/hugbox + +/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted/hugbox + desc = "A small, easily concealable toy handgun. Ages 8 and up. This one feels noticably less fun..." + mag_type = /obj/item/ammo_box/magazine/toy/pistol/hugbox + +/obj/item/gun/ballistic/shotgun/toy/unrestricted/hugbox + desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up. This one feels noticably less fun..." + mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/hugbox + +/obj/item/gun/ballistic/shotgun/toy/crossbow/hugbox + desc = "A weapon favored by many overactive children. Ages 8 and up. This one feels noticably less fun..." + mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow/hugbox + +obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/hugbox + desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up. This one feels noticably less fun..." + mag_type = /obj/item/ammo_box/magazine/toy/m762/hugbox + +/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/hugbox + desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up. This one feels noticably less fun..." + mag_type = /obj/item/ammo_box/magazine/toy/smgm45/hugbox \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 03d6582fac10..d0950331667a 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -1,3 +1,5 @@ +#define PLASMA_BASE_RECHARGE 500 + /obj/item/gun/energy/ionrifle name = "ion rifle" desc = "Invented in 2506 to quell attacks from SELF aligned IPCs, the NT-I1 is a bulky rifle designed to disable mechanical and electronic threats at range." @@ -129,26 +131,40 @@ var/progress_flash_divisor = 10 //copypasta is best pasta var/light_intensity = 1 var/charge_weld = 25 //amount of charge used up to start action (multiplied by amount) and per progress_flash_divisor ticks of welding - /// Contains the type paths for installed upgrades - var/installed_upgrades = list() - -/obj/item/gun/energy/plasmacutter/mini - name = "mini plasma cutter" - desc = "A weak plasma based mining tool." - icon_state = "plasmacutter_mini" - item_state = "plasmacutter_mini" - ammo_type = list(/obj/item/ammo_casing/energy/plasma/weak) - toolspeed = 2 + /// Contains the instances of installed upgrades + var/list/installed_upgrades = list() + /// Mod capacity of this item + var/mod_capacity = 80 + +/obj/item/gun/energy/plasmacutter/proc/modify_projectile(obj/projectile/plasma/K) + K.gun = src //do something special on-hit, easy! + for(var/obj/item/upgrade/plasmacutter/A in installed_upgrades) + A.modify_projectile(K) + +/obj/item/gun/energy/plasmacutter/proc/get_remaining_mod_capacity() + . = mod_capacity + for(var/obj/item/upgrade/plasmacutter/a in installed_upgrades) + . -= a.cost + return . /obj/item/gun/energy/plasmacutter/Initialize(mapload) AddElement(/datum/element/update_icon_blocker) . = ..() AddComponent(/datum/component/butchering, 25, 105, 0, 'sound/weapons/plasma_cutter.ogg') +/obj/item/gun/energy/plasmacutter/Destroy() + . = ..() + for(var/obj/item/upgrade/plasmacutter/a in installed_upgrades) + qdel(a) + QDEL_NULL(installed_upgrades) + /obj/item/gun/energy/plasmacutter/examine(mob/user) . = ..() if(cell) . += span_notice("[src] is [round(cell.percent())]% charged.") + . += span_boldnotice("[get_remaining_mod_capacity()]% mod capacity remaining.") + for(var/obj/item/upgrade/plasmacutter/a in installed_upgrades) + . += span_notice("There is \a [a] installed, using [span_bold("[a.cost]%")] capacity.") /obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user) var/charge_multiplier = 0 //2 = Refined stack, 1 = Ore @@ -156,16 +172,20 @@ charge_multiplier = 2 if(istype(I, /obj/item/stack/ore/plasma)) charge_multiplier = 1 - if(charge_multiplier) - if(cell.charge == cell.maxcharge) - to_chat(user, span_notice("You try to insert [I] into [src], but it's fully charged.")) //my cell is round and full - return - I.use(1) - cell.give(500*charge_multiplier) - to_chat(user, span_notice("You insert [I] in [src], recharging it.")) - else - ..() + if(!charge_multiplier) + return ..() + + var/obj/item/stack/S = I + var/charge_amount = PLASMA_BASE_RECHARGE * charge_multiplier // Get the amount of charge per item + // Get remaining capacity and get the ideal amount to recharge or all of the stack whichever is smaller + var/amount_to_eat = ceil(min(((cell.maxcharge - cell.charge) / charge_amount), S.get_amount())) + if(amount_to_eat == 0) + to_chat(user, span_notice("You try to insert [I] into [src], but it's fully charged.")) //my cell is round and full + return + I.use(amount_to_eat) + cell.give(charge_amount * amount_to_eat) + to_chat(user, span_notice("You insert [I] in [src], recharging it.")) // Tool procs, in case plasma cutter is used as welder // Can we start welding? /obj/item/gun/energy/plasmacutter/tool_start_check(mob/living/user, amount) @@ -211,12 +231,54 @@ else . = ..(amount=1) +/obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user) + . = ..() + if(istype(I, /obj/item/upgrade/plasmacutter)) + var/obj/item/upgrade/plasmacutter/PC = I + if(get_remaining_mod_capacity() < PC.cost) + to_chat(user, span_warning("There is no more room for this upgrade.")) + return + if(!PC.stackable && is_type_in_list(PC, installed_upgrades)) + to_chat(user, span_notice("[I] has already been installed in [src]")) + return + to_chat(user, span_notice("You install [I] into [src]")) + playsound(loc, 'sound/items/screwdriver.ogg', 100, 1) + installed_upgrades += I + PC.install(src) + I.forceMove(src) + +/obj/item/gun/energy/plasmacutter/crowbar_act(mob/living/user, obj/item/I) + . = TRUE + if(installed_upgrades.len) + to_chat(user, span_notice("You pry the modifications out.")) + I.play_tool_sound(src, 100) + for(var/obj/item/upgrade/plasmacutter/M in installed_upgrades) + M.forceMove(drop_location()) // Uninstallation handled in Exited(). + else + to_chat(user, span_notice("There are no modifications currently installed.")) + +/obj/item/gun/energy/plasmacutter/Exited(atom/movable/gone, direction) + ..() + if(gone in installed_upgrades) + var/obj/item/upgrade/plasmacutter/MK = gone + MK.uninstall(src) + +/obj/item/gun/energy/plasmacutter/mini + name = "mini plasma cutter" + desc = "A weak plasma based mining tool." + icon_state = "plasmacutter_mini" + item_state = "plasmacutter_mini" + ammo_type = list(/obj/item/ammo_casing/energy/plasma/weak) + toolspeed = 2 + mod_capacity = 50 + /obj/item/gun/energy/plasmacutter/adv name = "advanced plasma cutter" icon_state = "adv_plasmacutter" item_state = "adv_plasmacutter" force = 15 ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv) + mod_capacity = 100 /obj/item/gun/energy/plasmacutter/adv/mega name = "mega plasma cutter" @@ -224,6 +286,7 @@ item_state = "plasmacutter_mega" desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off xenos! Or, you know, mine stuff. This one has been enhanced with plasma magmite." ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv/mega) + mod_capacity = 120 /obj/item/gun/energy/plasmacutter/scatter name = "plasma cutter shotgun" @@ -232,15 +295,7 @@ desc = "An industrial-grade, heavy-duty mining shotgun." force = 10 ammo_type = list(/obj/item/ammo_casing/energy/plasma/scatter) - - - -/obj/item/gun/energy/plasmacutter/attackby(obj/item/I, mob/user) - . = ..() - if(try_upgrade(I, user)) - to_chat(user, span_notice("You install [I] into [src]")) - playsound(loc, 'sound/items/screwdriver.ogg', 100, 1) - qdel(I) + mod_capacity = 100 /obj/item/gun/energy/plasmacutter/scatter/mega name = "mega plasma cutter shotgun" @@ -248,6 +303,7 @@ item_state = "miningshotgun_mega" desc = "An industrial-grade, heavy-duty mining shotgun. This one seems... mega!" ammo_type = list(/obj/item/ammo_casing/energy/plasma/scatter/adv/mega) + mod_capacity = 120 /obj/item/gun/energy/plasmacutter/adv/cyborg name = "cyborg advanced plasma cutter" @@ -255,6 +311,7 @@ force = 15 selfcharge = 1 ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv/cyborg) + mod_capacity = 70 /obj/item/gun/energy/plasmacutter/adv/malf // Can't be subtype of cyborg or it will interfere with upgrades name = "cyborg malfunctioning plasma cutter" @@ -263,47 +320,83 @@ force = 15 selfcharge = 1 ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv/cyborg/malf) + mod_capacity = 100 // Upgrades for plasma cutters /obj/item/upgrade/plasmacutter name = "generic upgrade kit" - desc = "An upgrade for plasma shotguns." + desc = "An upgrade for plasma cutters." icon = 'icons/obj/objects.dmi' icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL + var/cost = 10 + var/stackable = FALSE + +/obj/item/upgrade/plasmacutter/examine(mob/user) + . = ..() + . += span_notice("This mod takes up [cost] mod capacity.") + + if(stackable) + . += span_notice("This mod is stackable.") + else + . += span_notice("This mod is not stackable.") + +/obj/item/upgrade/plasmacutter/proc/modify_projectile(obj/projectile/plasma/K) + +/obj/item/upgrade/plasmacutter/proc/install(obj/item/gun/energy/plasmacutter/P) + +/obj/item/upgrade/plasmacutter/proc/uninstall(obj/item/gun/energy/plasmacutter/P) + P.installed_upgrades -= src // Allows you to put the mod back in + /obj/item/upgrade/plasmacutter/defuser name = "plasma cutter defusal kit" - desc = "An upgrade for plasma shotguns that allows it to automatically defuse gibtonite." + desc = "An upgrade for plasma cutters that allows it to automatically defuse gibtonite." + +/obj/item/upgrade/plasmacutter/defuser/modify_projectile(obj/projectile/plasma/K) + K.defuse = TRUE /obj/item/upgrade/plasmacutter/capacity name = "plasma cutter capacity kit" - desc = "An upgrade for plasma shotguns that doubles the tank capacity." + desc = "An upgrade for plasma cutters that doubles the tank capacity." + cost = 20 -/obj/item/gun/energy/plasmacutter/proc/try_upgrade(obj/item/I, mob/user) - if(I.type in installed_upgrades) - to_chat(user, span_notice("[I] has already been installed in [src]")) - return FALSE - return FALSE +/obj/item/upgrade/plasmacutter/capacity/install(obj/item/gun/energy/plasmacutter/P) + P.cell.maxcharge = initial(P.cell.maxcharge)*2 -/obj/item/gun/energy/plasmacutter/scatter/try_upgrade(obj/item/I, mob/user) +/obj/item/upgrade/plasmacutter/capacity/uninstall(obj/item/gun/energy/plasmacutter/P) . = ..() - if(.) - return TRUE - if(istype(I, /obj/item/upgrade/plasmacutter/defuser)) - var/kaboom = new/obj/item/ammo_casing/energy/plasma/scatter/adv - ammo_type = list(kaboom) - installed_upgrades += I.type - return TRUE - if(istype(I, /obj/item/upgrade/plasmacutter/capacity)) - cell.maxcharge = initial(cell.maxcharge)*2 - installed_upgrades += I.type - return TRUE - return FALSE + P.cell.maxcharge = initial(P.cell.maxcharge) + P.cell.charge = min(P.cell.charge, P.cell.maxcharge) -//no upgrading this one either (for now) -/obj/item/gun/energy/plasmacutter/scatter/mega/try_upgrade(obj/item/I, mob/user) - return +/obj/item/upgrade/plasmacutter/cooldown + name = "plasma cutter cooldown kit" + desc = "An upgrade for plasma cutters that reduces the cooldown." + cost = 40 + stackable = TRUE + +/obj/item/upgrade/plasmacutter/cooldown/install(obj/item/gun/energy/plasmacutter/P) + P.fire_delay *= 0.5 + +/obj/item/upgrade/plasmacutter/cooldown/uninstall(obj/item/gun/energy/plasmacutter/P) + . = ..() + P.fire_delay *= 2 + +/obj/item/upgrade/plasmacutter/range + name = "plasma cutter range kit" + desc = "An upgrade for plasma cutters that increases the range." + cost = 30 + +/obj/item/upgrade/plasmacutter/range/modify_projectile(obj/projectile/plasma/K) + K.range += 4 + +/obj/item/upgrade/plasmacutter/ore + name = "plasma cutter ore kit" + desc = "An upgrade for plasma cutters that doubles ore output." + cost = 30 + +/obj/item/upgrade/plasmacutter/ore/modify_projectile(obj/projectile/plasma/K) + K.explosive = TRUE /obj/item/gun/energy/wormhole_projector name = "bluespace wormhole projector" @@ -512,3 +605,5 @@ icon_state = "prifle" item_state = "prifle" ammo_type = list(/obj/item/ammo_casing/energy/grimdark) + +#undef PLASMA_BASE_RECHARGE diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index bd1312dc6eb4..47faecb83048 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -131,23 +131,22 @@ /obj/projectile/blastwave/Range() ..() var/amount_destruction = EXPLODE_NONE - var/wallbreak_chance = 0 + var/wall_damage = 0 if(heavyr) amount_destruction = EXPLODE_DEVASTATE - wallbreak_chance = 99 + wall_damage = INFINITY else if(mediumr) amount_destruction = EXPLODE_HEAVY - wallbreak_chance = 66 + wall_damage = 500 else if(lightr) amount_destruction = EXPLODE_LIGHT - wallbreak_chance = 33 + wall_damage = 150 if(amount_destruction) if(hugbox) loc.contents_explosion(EXPLODE_HEAVY, loc) if(istype(loc, /turf/closed/wall)) var/turf/closed/wall/W = loc - if(prob(wallbreak_chance)) - W.dismantle_wall(TRUE, TRUE) + W.take_damage(wall_damage, BRUTE, BOMB) else switch(amount_destruction) if(EXPLODE_DEVASTATE) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index cb890ec8514b..387db11f0475 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -67,7 +67,8 @@ var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored. var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. Used for hitscan effect generation. var/datum/point/beam_index - var/turf/hitscan_last //last turf touched during hitscanning. + /// The ending/last touched turf during hitscanning. + var/turf/hitscan_last var/tracer_type var/muzzle_type var/impact_type @@ -172,6 +173,11 @@ impacted = list() decayedRange = range + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/projectile/proc/Range() range-- if(wound_bonus != CANT_WOUND) @@ -244,8 +250,11 @@ splatter_dir = get_dir(starting, target_loca) if(isalien(L) || ispolysmorph(L)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) - else if (iscarbon(L) && !(NOBLOOD in C.dna.species.species_traits)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + else if(iscarbon(L) && !(NOBLOOD in C.dna.species.species_traits)) + var/splatter_color + var/mob/living/carbon/carbon_bleeder = L + splatter_color = carbon_bleeder.dna.blood_type.color + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, splatter_color) else new /obj/effect/temp_visual/dir_setting/bloodsplatter/genericsplatter(target_loca, splatter_dir) var/obj/item/bodypart/B = L.get_bodypart(def_zone) @@ -596,10 +605,9 @@ pixel_x = trajectory.return_px() pixel_y = trajectory.return_py() forcemoved = TRUE - hitscan_last = loc else if(T != loc) step_towards(src, T) - hitscan_last = loc + hitscan_last = T if(!hitscanning && !forcemoved) pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move @@ -719,8 +727,7 @@ angle = ATAN2(y - oy, x - ox) return list(angle, p_x, p_y) -/obj/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it. - . = ..() +/obj/projectile/proc/on_entered(datum/source, atom/movable/AM, ...) //A mob moving on a tile with a projectile is hit by it. if(isliving(AM) && !(pass_flags & PASSMOB)) var/mob/living/L = AM if(can_hit_target(L, impacted, (AM == original))) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ebef6ac497c6..3fa45a7392c4 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -116,6 +116,7 @@ name = "pulse" icon_state = "u_laser" damage = 50 + demolition_mod = 6 // it has three settings, and they are all DESTROY. impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE tracer_type = /obj/effect/projectile/tracer/pulse @@ -124,11 +125,6 @@ /obj/projectile/beam/pulse/on_hit(atom/target, blocked = FALSE) . = ..() - if (!QDELETED(target) && (isturf(target) || istype(target, /obj/structure/))) - if(isobj(target)) - SSexplosions.med_mov_atom += target - else - SSexplosions.medturf += target var/turf/open/target_turf = get_turf(target) if(istype(target_turf)) target_turf.IgniteTurf(rand(8, 22), "blue") @@ -153,7 +149,7 @@ damage = 30 wound_bonus = -40 bare_wound_bonus = 70 - demolition_mod = 3 // industrial laser + demolition_mod = 2.4 // industrial laser, strong but not quite enough for reinforced walls impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser light_color = LIGHT_COLOR_GREEN @@ -165,20 +161,13 @@ icon_state = "u_laser" damage = 50 // EVEN MORE power for the SM range = 250 // More power means longer range + demolition_mod = 4 // too powerful for its own good, CAN destroy reinforced walls impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE tracer_type = /obj/effect/projectile/tracer/pulse muzzle_type = /obj/effect/projectile/muzzle/pulse impact_type = /obj/effect/projectile/impact/pulse -/obj/projectile/beam/emitter/pulse/on_hit(atom/target, blocked = FALSE) - . = ..() - if (!QDELETED(target) && (isturf(target) || istype(target, /obj/structure/))) - if(isobj(target)) - SSexplosions.low_mov_atom += target - else - SSexplosions.lowturf += target - /obj/projectile/beam/lasertag name = "laser tag beam" icon_state = "omnilaser" diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 00961f96658f..4c51d5f16d52 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -21,7 +21,7 @@ SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) if(C.dna && (C.dna.check_mutation(HULK))) - C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") + C.say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ), forced = "hulk") else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), jitter), 5) //yogstation edit begin ------------------------------------------- diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm index 8d118e57b92c..34714bd6a098 100644 --- a/code/modules/projectiles/projectile/reusable/arrow.dm +++ b/code/modules/projectiles/projectile/reusable/arrow.dm @@ -290,7 +290,7 @@ SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) if(C.dna && (C.dna.check_mutation(HULK))) - C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") + C.say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ), forced = "hulk") else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), jitter), 5) if(istype(C.getorganslot(ORGAN_SLOT_STOMACH), /obj/item/organ/stomach/cell/ethereal)) diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm index b2de093296c7..4a177b39cdf6 100644 --- a/code/modules/projectiles/projectile/special/hallucination.dm +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -169,7 +169,7 @@ hal_target.Paralyze(100) hal_target.adjust_stutter(2 SECONDS) if(hal_target.dna && (hal_target.dna.check_mutation(HULK))) - hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") + hal_target.say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ), forced = "hulk") else if((hal_target.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(hal_target, TRAIT_STUNIMMUNE)) addtimer(CALLBACK(hal_target, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 0.5 SECONDS) diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index ce7137a504ab..85f746a4e30b 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -16,6 +16,10 @@ light_color = LIGHT_COLOR_PURPLE light_range = 2 + var/obj/item/gun/energy/plasmacutter/gun + var/defuse = FALSE + var/explosive = FALSE + /obj/projectile/plasma/weak name = "weak plasma blast" icon_state = "plasmacutter_weak" @@ -24,6 +28,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED mine_range = 0 + //yogs begin /obj/projectile/plasma/Move(atom/newloc, dir) . = ..() @@ -34,9 +39,12 @@ //yogs end /obj/projectile/plasma/on_hit(atom/target) . = ..() + if(defuse && istype(target, /turf/closed/mineral/gibtonite)) + var/turf/closed/mineral/gibtonite/gib = target + gib.defuse() if(ismineralturf(target)) var/turf/closed/mineral/M = target - M.attempt_drill(firer) + M.attempt_drill(firer, explosive) if(mine_range) mine_range-- range++ @@ -52,12 +60,6 @@ return BULLET_ACT_FORCE_PIERCE // yogs end -/obj/projectile/plasma/scatter/adv/on_hit(atom/target) - if(istype(target, /turf/closed/mineral/gibtonite)) - var/turf/closed/mineral/gibtonite/gib = target - gib.defuse() - . = ..() - /obj/projectile/plasma/adv damage = 7 range = 5 @@ -78,6 +80,7 @@ // Same as the scatter but with automatic defusing /obj/projectile/plasma/scatter/adv + defuse = TRUE // Megafauna loot, possibly best cutter? /obj/projectile/plasma/scatter/adv/stalwart diff --git a/code/modules/projectiles/projectile/special/reagent.dm b/code/modules/projectiles/projectile/special/reagent.dm index 524180486c7b..e19024470544 100644 --- a/code/modules/projectiles/projectile/special/reagent.dm +++ b/code/modules/projectiles/projectile/special/reagent.dm @@ -47,6 +47,25 @@ last_volume = R.volume name = "\proper [lowertext(R.name)]" +// PRESSURE WASHER +/obj/projectile/reagent/pressure_washer + name = "\proper high-pressure water" + icon = 'icons/effects/effects.dmi' + icon_state = "extinguish" + range = 7 + reagents_list = list(/datum/reagent/water = 10) + speed = 0.6 // very high power + +/obj/projectile/reagent/pressure_washer/on_hit(atom/movable/target, blocked) + . = ..() + if(istype(target) && !target.anchored && prob(20)) + target.throw_at(get_step(target, dir), 1, 1, firer) + +/obj/projectile/reagent/pressure_washer/Move(atom/newloc, dir) + . = ..() + if(newloc) + newloc.wash(CLEAN_SCRUB) // wash everything in its path + /// Xeno neurotoxin /obj/projectile/reagent/neurotoxin name = "neurotoxin spit" diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 3d220e4842a3..0a39cfd58b33 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -10,7 +10,7 @@ /obj/projectile/bullet/a84mm name ="\improper HEDP rocket" - desc = "USE A WEEL GUN" + desc = "USE A WEEL GUN." icon_state= "84mm-hedp" armor_flag = BOMB damage = 80 @@ -73,7 +73,7 @@ /obj/projectile/bullet/cball name = "cannonball" icon_state = "cannonball" - desc = "Not for bowling purposes" + desc = "Not for bowling purposes." damage = 30 demolition_mod = 20 // YARRR @@ -91,5 +91,5 @@ /obj/projectile/bullet/bolt name = "bolt" icon_state = "bolt" - desc = "smaller and faster rod" + desc = "A smaller and faster rod." damage = 25 diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8da7a9a9c656..47f0fcd07199 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -730,7 +730,7 @@ //yogs start - snowflake synth check if(!istype(R, /datum/reagent/medicine/synthflesh) && ishuman(my_atom)) var/mob/living/carbon/human/H = my_atom - if(istype(H.dna.species, /datum/species/synth)) + if(H?.dna?.species && istype(H.dna.species, /datum/species/ipc/self/insurgent)) return R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete //yogs end diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index ce0225b4e1ea..ec3bea63fddd 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -97,7 +97,7 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#221915" // rgb: 34, 25, 21 taste_description = "malt and chocolate" glass_name = "glass of stout" - glass_desc = "a cold pint of 'genius' brand stout." + glass_desc = "A cold pint of 'genius' brand stout." /datum/reagent/consumable/ethanol/beer/stout/irishflip name = "Irish Flip" @@ -106,7 +106,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "chocolate cream and egg" glass_icon_state = "irish_flip" glass_name = "glass of irish flip" - glass_desc = "a fancy glass of creamy cocktail." + glass_desc = "A fancy glass of creamy cocktail." /datum/reagent/consumable/ethanol/beer/stout/blackvelvet name = "Black Velvet" @@ -115,7 +115,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "Champagne with a hint of chocolate." glass_icon_state = "black_velvet" glass_name = "glass of black velvet" - glass_desc = "a fancy drink with a melancholic past." + glass_desc = "A fancy drink with a melancholic past." /datum/reagent/consumable/ethanol/beer/stout/espressomartini name = "Espresso Martini" @@ -124,7 +124,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "bitterness, chocolate, and cream." glass_icon_state = "espresso_martini" glass_name = "glass of espresso martini" - glass_desc = "a cocktail guaranteed to keep you awake." + glass_desc = "A cocktail guaranteed to keep you awake." /////////////////////////////////////////// /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" @@ -2281,7 +2281,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "dried plums and malt" glass_icon_state = "trappistglass" glass_name = "Trappist Beer" - glass_desc = "boozy Catholicism in a glass." + glass_desc = "Boozy Catholicism in a glass." /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M) if(M.mind.holy_role) @@ -2440,7 +2440,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "tequila, creme de menthe, and a hint of medicine?" glass_icon_state = "flaming_moe2" glass_name = "Flaming Moe" - glass_desc = "an amazing concoction of various different bar drinks and a secret ingredient" + glass_desc = "An amazing concoction of various different bar drinks and a secret ingredient" /datum/reagent/consumable/ethanol/flaming_moe/on_mob_life(mob/living/carbon/M) M.adjust_drowsiness(-5 SECONDS) diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 3669ab2062c8..2ef4ae5a2b54 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -200,6 +200,13 @@ glass_desc = "White and nutritious goodness!" default_container = /obj/item/reagent_containers/food/condiment/milk +/datum/reagent/consumable/milk/coconut + name = "Coconut Milk" + description = "An opaque white liquid produced by the mammary glands of a coconut... wait what?" + taste_description = "coconut" + glass_icon_state = "coconut_milk" //disregard it spawning the coconut shell out of nowhere + glass_name = "glass of coconut milk" + /datum/reagent/consumable/cilk name = "Cilk" description = "A mixture of milk and.... cola? Who the fuck would do this?" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index cb7497ab4512..6b36dc502722 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -396,6 +396,14 @@ reagent_state = LIQUID color = "#FFEBEB" +/datum/reagent/medicine/synthflesh/on_mob_add(mob/living/L) + if(ishuman(L)) + var/mob/living/carbon/human/dude = L + if(dude?.dna?.species && istype(dude.dna.species, /datum/species/ipc/self/insurgent)) + var/datum/species/ipc/self/insurgent/sneaky = dude.dna.species + sneaky.assume_disguise(dude) + . = ..() + /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, methods=TOUCH, reac_volume,show_message = 1) var/can_heal = FALSE if(iscarbon(M)) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index b18ce9843a65..7b1bada31e66 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1548,6 +1548,7 @@ M.adjust_jitter_up_to(2, 10) else if(M.bodytemperature < T0C) heal_factor *= (100 + max(T0C - M.bodytemperature, 200)) / 100 // if you're asleep, you get healed faster when you're cold (up to 3x at 73 kelvin) + M.adjustOxyLoss(-10*heal_factor*REM) M.adjustFireLoss(-7*heal_factor*REM) M.adjustToxLoss(-5*heal_factor*REM) M.adjustBruteLoss(-5*heal_factor*REM) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 95ab7b1c64cf..18994d5952e3 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -265,7 +265,7 @@ /datum/reagent/toxin/plantbgone/reaction_mob(mob/living/M, methods=TOUCH, reac_volume) if(istype(M, /mob/living/simple_animal/hostile/venus_human_trap)) var/mob/living/simple_animal/hostile/venus_human_trap/planty = M - planty.weedkiller(reac_volume) + planty.weedkiller(reac_volume * 2) if(methods & VAPOR) if(iscarbon(M)) var/mob/living/carbon/C = M diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 38f41a967a5d..7bcec196672f 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -6,7 +6,7 @@ volume = 200 var/datum/blood_type/blood_type = null var/unique_blood = null - var/labelled = 0 + var/labelled = FALSE #define BLOODBAG_GULP_SIZE 10 @@ -79,15 +79,13 @@ blood_type = "E" else blood_type = null - update_pack_name() - update_appearance(UPDATE_ICON) + update_appearance(UPDATE_ICON | UPDATE_NAME) -/obj/item/reagent_containers/blood/proc/update_pack_name() - if(!labelled) - if(blood_type) - name = "blood pack[blood_type ? " - [unique_blood ? blood_type : blood_type.name]" : null]" - else - name = "blood pack" +/obj/item/reagent_containers/blood/update_name() + . = ..() + if(labelled) + return + name = "blood pack[blood_type ? " - [unique_blood ? blood_type : blood_type.name]" : ""]" /obj/item/reagent_containers/blood/update_overlays() . = ..() @@ -149,10 +147,10 @@ if(user.get_active_held_item() != I) return if(t) - labelled = 1 + labelled = TRUE name = "blood pack - [t]" else - labelled = 0 - update_pack_name() + labelled = FALSE + update_appearance(UPDATE_NAME) else return ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 357ebd1f6a58..aefdfde71d44 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -12,7 +12,7 @@ /obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() - if(. && obj_integrity > 0) + if(. && atom_integrity > 0) if(tank_volume && (damage_flag == BULLET || damage_flag == LASER)) boom() diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index ca3b71f99003..f5f2420d612e 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -57,6 +57,14 @@ else icon_state = "condisposal" +// Extra layer handling +/obj/structure/disposalconstruct/update_icon() + . = ..() + if(!is_pipe()) + return + + layer = anchored ? initial(pipe_type.layer) : initial(layer) + /obj/structure/disposalconstruct/proc/get_disposal_dir() if(!is_pipe()) return NONE diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index 32c30dc8552a..14ab8777e3f7 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -10,7 +10,8 @@ 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) - layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes + plane = FLOOR_PLANE + layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 var/dpdir = NONE // bitmask of pipe directions var/initialize_dirs = NONE // bitflags of pipe directions added on init, see \code\_DEFINES\pipe_construction.dm @@ -45,10 +46,10 @@ // pipe is deleted // ensure if holder is present, it is expelled /obj/structure/disposalpipe/Destroy() - var/obj/structure/disposalholder/H = locate() in src - if(H) - H.active = FALSE - expel(H, get_turf(src), 0) + for(var/obj/structure/disposalholder/H as anything in src) + if(istype(H)) + H.active = FALSE + expel(H, get_turf(src), 0) QDEL_NULL(stored) return ..() @@ -134,7 +135,7 @@ H.contents_explosion(severity, target) -/obj/structure/disposalpipe/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) +/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 ..() diff --git a/code/modules/religion/religion_structures.dm b/code/modules/religion/religion_structures.dm index 7a08fc3a5053..dfd4f76b3669 100644 --- a/code/modules/religion/religion_structures.dm +++ b/code/modules/religion/religion_structures.dm @@ -25,7 +25,7 @@ AddComponent(/datum/component/religious_tool, ALL, FALSE, CALLBACK(src, PROC_REF(reflect_sect_in_icons))) /obj/structure/table/altar_of_gods/attackby(obj/item/I, mob/user, params) - if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, I, user, params) & COMPONENT_NO_AFTERATTACK) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, I, user, params) & COMPONENT_NO_AFTERATTACK) return TRUE // this signal needs to be sent early so the bible can actually be used on it return ..() diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 662afefd71ff..cfe5f7192bcd 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -179,6 +179,16 @@ maxstack = MAXCOIL departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE +/datum/design/ethernet_coil + name = "Ethernet Coil" + id = "ethernet_coil" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 10, /datum/material/glass = 5) + build_path = /obj/item/stack/ethernet_coil + category = list("initial","Tools","Tool Designs") + maxstack = MAXCOIL + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + /datum/design/toolbox name = "Toolbox" id = "tool_box" diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 9737eb886c41..756659a03ddc 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -310,10 +310,3 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/ai_resource_distribution - name = "Computer Design (AI Resource Distribution Console)" - desc = "Allows for the construction of circuit boards used to build an AI Resource Distribution console." - id = "ai_resource_distribution" - build_path = /obj/item/circuitboard/computer/ai_resource_distribution - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/computer_part_designs.dm b/code/modules/research/designs/computer_part_designs.dm index 86121f56892f..0bda24620b6e 100644 --- a/code/modules/research/designs/computer_part_designs.dm +++ b/code/modules/research/designs/computer_part_designs.dm @@ -261,3 +261,13 @@ build_path = /obj/item/computer_hardware/sensorpackage category = list("Computer Parts") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +// Intellicard slot +/datum/design/network_interface + name = "AI Network Interface" + id = "aiinterface" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600) + build_path = /obj/item/computer_hardware/ai_interface + category = list("Computer Parts") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 205047e1c867..dfa6042f3e01 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -715,6 +715,15 @@ category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING +/datum/design/board/synth_pod + name = "Machine Design (Synthetic Storage Unit)" + desc = "The circuit board for a synthetic storage unit." + id = "synth_pod" + build_path = /obj/item/circuitboard/machine/synth_pod + category = list ("Engineering Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + + /datum/design/board/decontamination_unit name = "Machine Design (Decontamination Unit)" desc = "The circuit board for a decontamination unit." @@ -739,6 +748,22 @@ category = list("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE +/datum/design/board/networking_machine + name = "Machine Design (Networking Machine)" + desc = "The circuit board for a dual-purpose networking machine." + id = "networking_machine" + build_path = /obj/item/circuitboard/machine/networking_machine + category = list("Engineering Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/subcontroller + name = "Machine Design (Subcontroller)" + desc = "The circuit board for a subcontroller mainframe." + id = "subcontroller" + build_path = /obj/item/circuitboard/machine/subcontroller + category = list("Engineering Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + /datum/design/board/ai_data_core name = "Machine Design (AI Data Core Board)" desc = "The circuit board for an AI data core." diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 9b5a012ee9cd..14f89cc5dde3 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -411,6 +411,66 @@ construction_time = 1200 category = list("Exosuit Equipment") +/datum/design/mech_thrusters + name = "Exosuit Module (RCS Thruster Package)" + desc = "A thruster package for exosuits. Expels gas from the internal life-support air tank to generate thrust." + id = "mech_thrusters" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/thrusters/gas + materials = list(/datum/material/iron=25000,/datum/material/titanium=5000,/datum/material/silver=3000) + construction_time = 100 + category = list("Exosuit Equipment") + +/datum/design/mech_pipe_dispenser + name = "Exosuit Module (Pipe Dispenser Module)" + desc = "An exosuit-mounted Rapid Pipe Dispenser." + id = "mech_pipe_dispenser" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/pipe_dispenser + materials = list(/datum/material/iron=10000,/datum/material/glass=2000) + construction_time = 100 + category = list("Exosuit Equipment") + +/datum/design/mech_t_scanner + name = "Exosuit Module (T-ray Scanner Module)" + desc = "An exosuit-mounted Terahertz-Ray Scanner." + id = "mech_t_scanner" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/t_scanner + materials = list(/datum/material/iron=2000) + construction_time = 50 + category = list("Exosuit Equipment") + +/datum/design/mech_washer + name = "Exosuit Module (Pressure Washer)" + desc = "An exosuit-mounted pressure washer." + id = "mech_washer" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/pressure_washer + materials = list(/datum/material/iron=2000) + construction_time = 50 + category = list("Exosuit Equipment") + +/datum/design/mech_mop + name = "Exosuit Module (Mop)" + desc = "An exosuit-mounted mop." + id = "mech_mop" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/melee_weapon/mop + materials = list(/datum/material/iron=2000) + construction_time = 50 + category = list("Exosuit Equipment") + +/datum/design/mech_flyswatter + name = "Exosuit Module (Flyswatter)" + desc = "An exosuit-mounted flyswatter." + id = "mech_flyswatter" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/melee_weapon/flyswatter + materials = list(/datum/material/iron=2000) + construction_time = 50 + category = list("Exosuit Equipment") + /datum/design/mech_gravcatapult name = "Exosuit Module (Gravitational Catapult Module)" desc = "An exosuit mounted Gravitational Catapult." diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 87ec3c3c5c8a..33187c8016e3 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -72,16 +72,6 @@ construction_time = 100 category = list("Ripley") -//firefighter subtype -/datum/design/firefighter_chassis - name = "Exosuit Chassis (APLU \"Firefighter\")" - id = "firefighter_chassis" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/chassis/firefighter - materials = list(/datum/material/iron=20000) - construction_time = 100 - category = list("Firefighter") - /datum/design/ripley_torso name = "Exosuit Torso (APLU \"Ripley\")" id = "ripley_torso" @@ -89,7 +79,7 @@ build_path = /obj/item/mecha_parts/part/ripley_torso materials = list(/datum/material/iron=20000, /datum/material/glass=7500) construction_time = 200 - category = list("Ripley","Firefighter") + category = list("Ripley") /datum/design/ripley_left_arm name = "Exosuit Left Arm (APLU \"Ripley\")" @@ -98,7 +88,7 @@ build_path = /obj/item/mecha_parts/part/ripley_left_arm materials = list(/datum/material/iron=15000) construction_time = 150 - category = list("Ripley","Firefighter") + category = list("Ripley") /datum/design/ripley_right_arm name = "Exosuit Right Arm (APLU \"Ripley\")" @@ -107,7 +97,7 @@ build_path = /obj/item/mecha_parts/part/ripley_right_arm materials = list(/datum/material/iron=15000) construction_time = 150 - category = list("Ripley","Firefighter") + category = list("Ripley") /datum/design/ripley_left_leg name = "Exosuit Left Leg (APLU \"Ripley\")" @@ -116,7 +106,7 @@ build_path = /obj/item/mecha_parts/part/ripley_left_leg materials = list(/datum/material/iron=15000) construction_time = 150 - category = list("Ripley","Firefighter") + category = list("Ripley") /datum/design/ripley_right_leg name = "Exosuit Right Leg (APLU \"Ripley\")" @@ -125,7 +115,7 @@ build_path = /obj/item/mecha_parts/part/ripley_right_leg materials = list(/datum/material/iron=15000) construction_time = 150 - category = list("Ripley","Firefighter") + category = list("Ripley") //Odysseus /datum/design/odysseus_chassis @@ -636,7 +626,7 @@ //Exosuit Equipment /datum/design/ripleyupgrade - name = "Ripley MK-I to MK-II conversion kit" + name = "APLU MK-II \"Firefighter\" conversion kit" id = "ripleyupgrade" build_type = MECHFAB build_path = /obj/item/mecha_parts/mecha_equipment/ripleyupgrade diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index eb8ec7b9a1af..ff01af524c1f 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -11,7 +11,7 @@ construction_time = 75 build_path = /obj/item/mmi category = list("Control Interfaces", "Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE /datum/design/posibrain name = "Positronic Brain" @@ -22,7 +22,7 @@ construction_time = 75 build_path = /obj/item/mmi/posibrain category = list("Control Interfaces", "Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE /datum/design/bluespacebeaker name = "Bluespace Beaker" @@ -708,7 +708,7 @@ ///////////////////// /datum/design/surgery name = "Surgery Design" - desc = "what" + desc = "What." id = "surgery_parent" research_icon = 'icons/misc/surgery_icons.dmi' research_icon_state = "surgery_any" diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index 81d5f1921b36..fc09ddb578e8 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -81,12 +81,12 @@ /datum/nanite_program/monitoring/enable_passive_effect() . = ..() - SSnanites.nanite_monitored_mobs |= host_mob + ADD_TRAIT(host_mob, TRAIT_SUITLESS_SENSORS, NANITE_TRAIT) host_mob.hud_set_nanite_indicator() /datum/nanite_program/monitoring/disable_passive_effect() . = ..() - SSnanites.nanite_monitored_mobs -= host_mob + REMOVE_TRAIT(host_mob, TRAIT_SUITLESS_SENSORS, NANITE_TRAIT) host_mob.hud_set_nanite_indicator() /datum/nanite_program/triggered/self_scan diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index a0cc937c928b..b2293f7bd86b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -39,7 +39,7 @@ starting_node = TRUE display_name = "Basic Exosuit Equipment" description = "Various tools fit for basic mech units" - design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") + design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer", "mech_t_scanner", "mech_pipe_dispenser") /datum/techweb_node/clarke id = "mecha_clarke" @@ -399,7 +399,7 @@ display_name = "Artificial Intelligence" description = "AI unit research." prereq_ids = list("base") - design_ids = list("server_cabinet", "ai_data_core", "ai_core_display", "ai_server_overview", "ram1", "basic_ai_cpu", "ai_resource_distribution", "aifixer", "safeguard_module", "onehuman_module", "protectstation_module", "quarantine_module", "oxygen_module", "freeform_module", "reset_module", "purge_module", "remove_module", "freeformcore_module", "asimov_module", "crewsimov_module", "pranksimov_module", "paladin_module", "tyrant_module", "overlord_module", "ceo_module", "cowboy_module", "mother_module", "silicop_module", "construction_module", "metaexperiment_module", "researcher_module", "siliconcollective_module", "spotless_module", "clown_module", "chapai_module", "druid_module", "detective_module", "reporter_module", "wafflehouse_module", "default_module", "borg_ai_control", "mecha_tracking_ai_control", "intellicard") + design_ids = list("server_cabinet", "networking_machine", "subcontroller", "synth_pod", "ai_data_core", "ai_core_display", "ai_server_overview", "ram1", "basic_ai_cpu", "aifixer", "safeguard_module", "onehuman_module", "reporter_module", "protectstation_module", "quarantine_module", "oxygen_module", "freeform_module", "reset_module", "purge_module", "remove_module", "freeformcore_module", "asimov_module", "crewsimov_module", "paladin_module", "tyrant_module", "overlord_module", "ceo_module", "cowboy_module", "mother_module", "silicop_module", "construction_module", "metaexperiment_module", "researcher_module", "siliconcollective_module", "spotless_module", "clown_module", "chapai_module", "druid_module", "detective_module", "default_module", "borg_ai_control", "mecha_tracking_ai_control", "intellicard") research_costs = list(TECHWEB_POINT_TYPE_AI = 1000) /////////////////////////EMP tech///////////////////////// @@ -455,7 +455,7 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) //they are really shitty design_ids = list("hdd_basic", "hdd_advanced", "hdd_super", "hdd_cluster", "ssd_small", "ssd_micro", "netcard_basic", "netcard_advanced", "netcard_wired", "portadrive_basic", "portadrive_advanced", "portadrive_super", "cardslot", "secondcardslot", "aislot", "miniprinter", "APClink", "bat_control", "bat_normal", "bat_advanced", - "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small", "sensorpackage") + "bat_super", "bat_micro", "bat_nano", "cpu_normal", "pcpu_normal", "cpu_small", "pcpu_small", "sensorpackage", "aiinterface") /datum/techweb_node/computer_board_gaming id = "computer_board_gaming" @@ -620,7 +620,7 @@ display_name = "Advanced Sanitation Technology" description = "Clean things better, faster, stronger, and harder!" prereq_ids = list("adv_engi") - design_ids = list("advmop", "buffer", "blutrash", "light_replacer", "spraybottle", "beartrap") + design_ids = list("advmop", "buffer", "blutrash", "light_replacer", "spraybottle", "beartrap", "mech_washer", "mech_mop", "mech_flyswatter") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/botany @@ -661,7 +661,7 @@ description = "Unlocks new RCD designs." design_ids = list("rcd_upgrade_silo_link") prereq_ids = list("rcd_upgrade", "bluespace_travel") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 25000) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /////////////////////////weaponry tech///////////////////////// @@ -857,7 +857,7 @@ display_name = "Advanced Exosuit Equipment" description = "Tools for high level mech suits" prereq_ids = list("adv_mecha") - design_ids = list("mech_rcd") + design_ids = list("mech_rcd", "mech_thrusters") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/med_mech_tools diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 94a447f35563..850f99cf67fe 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -93,7 +93,7 @@ Slimecrossing Items brute_loss = M.bruteloss else if(isobj(parent)) var/obj/O = parent - integrity = O.obj_integrity + integrity = O.get_integrity() addtimer(CALLBACK(src, PROC_REF(rewind)), DEJAVU_REWIND_INTERVAL) /datum/component/dejavu/proc/rewind() @@ -116,7 +116,7 @@ Slimecrossing Items M.updatehealth() else if(isobj(parent)) var/obj/O = parent - O.obj_integrity = integrity + O.update_integrity(integrity) //comes after healing so new limbs comically drop to the floor if(!isnull(x) && istype(parent, /atom/movable)) diff --git a/code/modules/research/xenobiology/crossbreeding/_structures.dm b/code/modules/research/xenobiology/crossbreeding/_structures.dm index 5cd551f7d3d4..2cab47dc6193 100644 --- a/code/modules/research/xenobiology/crossbreeding/_structures.dm +++ b/code/modules/research/xenobiology/crossbreeding/_structures.dm @@ -29,8 +29,7 @@ GLOBAL_LIST_EMPTY(bluespace_slime_crystals) . = ..() if(master_crystal) invisibility = INVISIBILITY_MAXIMUM - max_integrity = 1000 - obj_integrity = 1000 + modify_max_integrity(1000, FALSE) /obj/structure/slime_crystal/Initialize(mapload) . = ..() diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index b7f63b53ef17..5d53cfab3914 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -136,7 +136,7 @@ Consuming extracts: name = "water cookie" desc = "A transparent blue cookie. Constantly dripping wet." icon_state = "blue" - taste = /datum/reagent/water + taste = "clear spring water" /obj/item/slime_cookie/blue/do_effect(mob/living/M, mob/user) M.apply_status_effect(/datum/status_effect/watercookie) @@ -150,7 +150,7 @@ Consuming extracts: name = "metallic cookie" desc = "A shiny grey cookie. Hard to the touch." icon_state = "metal" - taste = /datum/reagent/copper + taste = "sweet iron" /obj/item/slime_cookie/metal/do_effect(mob/living/M, mob/user) M.apply_status_effect(/datum/status_effect/metalcookie) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 162fa895b20b..5d872df11e39 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -173,7 +173,7 @@ Regenerative extracts: src.forceMove(user.loc) var/obj/item/slimecross/X = new /obj/item/slimecross/regenerative(user.loc) X.name = name - X.desc = desc + X.effect_desc = effect_desc user.put_in_active_hand(X) to_chat(user, span_notice("Some of the milky goo congeals in your hand!")) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index cfb46a1e3f55..0c4c33e77d0f 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -133,9 +133,7 @@ r_pocket = /obj/item/gun/ballistic/automatic/pistol id = /obj/item/card/id/syndicate/anyone implants = list(/obj/item/implant/weapons_auth) - backpack_contents = list( - /obj/item/storage/box/syndie - ) + box = /obj/item/storage/box/survival/syndie /datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H) H.faction |= ROLE_SYNDICATE @@ -168,7 +166,6 @@ suit = /obj/item/clothing/suit/armor/vest back = /obj/item/storage/backpack backpack_contents = list( - /obj/item/storage/box/syndie, /obj/item/modular_computer/tablet/preset/syndicate=1 ) @@ -176,9 +173,7 @@ name = "Space Syndicate Comms Agent" r_hand = /obj/item/kitchen/knife/combat back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box/syndie - ) + backpack_contents = null /datum/outfit/lavaland_syndicate/comms/lieutenant name = "Space Syndicate Comms Agent Lieutenant" @@ -187,7 +182,6 @@ r_pocket = null back = /obj/item/storage/backpack backpack_contents = list( - /obj/item/storage/box/syndie, /obj/item/modular_computer/tablet/preset/syndicate=1, /obj/item/gun/ballistic/revolver/ultrasecure=1 ) diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 0a9e180d5fdc..1748264cb05f 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -48,7 +48,7 @@ else meat_counter++ H.gib() - obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril + update_integrity(min(atom_integrity + max_integrity * 0.05, max_integrity)) //restores 5% hp of tendril for(var/mob/living/L in view(src, 5)) if(L.mind?.has_antag_datum(/datum/antagonist/ashwalker)) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "oogabooga", /datum/mood_event/sacrifice_good) diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 7582c07dc184..04f79c27ebbe 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -120,21 +120,19 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) /obj/item/hilbertshotel/proc/sendToNewRoom(roomNumber, mob/user) var/datum/turf_reservation/roomReservation = SSmapping.request_turf_block_reservation(hotelRoomTemp.width, hotelRoomTemp.height) - if(ruinSpawned) - mysteryRoom = GLOB.hhmysteryRoomNumber - if(roomNumber == mysteryRoom) - hotelRoomTempLore.load(locate(roomReservation.bottom_left_turfs[1], roomReservation.bottom_left_turfs[2], roomReservation.bottom_left_turfs[3])) - else - hotelRoomTemp.load(locate(roomReservation.bottom_left_turfs[1], roomReservation.bottom_left_turfs[2], roomReservation.bottom_left_turfs[3])) + var/turf/bottomLeft = roomReservation.bottom_left_turfs[1] + if(ruinSpawned && (roomNumber == GLOB.hhmysteryRoomNumber)) + hotelRoomTempLore.load(bottomLeft) else - hotelRoomTemp.load(locate(roomReservation.bottom_left_turfs[1], roomReservation.bottom_left_turfs[2], roomReservation.bottom_left_turfs[3])) + hotelRoomTemp.load(bottomLeft) activeRooms["[roomNumber]"] = roomReservation linkTurfs(roomReservation, roomNumber) do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_turfs[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_turfs[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_turfs[3])) + user.forceMove(locate(bottomLeft.x + hotelRoomTemp.landingZoneRelativeX, bottomLeft.y + hotelRoomTemp.landingZoneRelativeY, bottomLeft.z)) /obj/item/hilbertshotel/proc/linkTurfs(datum/turf_reservation/currentReservation, currentRoomnumber) - var/area/hilbertshotel/currentArea = get_area(locate(currentReservation.bottom_left_turfs[1], currentReservation.bottom_left_turfs[2], currentReservation.bottom_left_turfs[3])) + var/turf/bottomLeft = currentReservation.bottom_left_turfs[1] + var/area/hilbertshotel/currentArea = get_area(bottomLeft) currentArea.name = "Hilbert's Hotel Room [currentRoomnumber]" currentArea.parentSphere = src currentArea.storageTurf = storageTurf @@ -150,9 +148,10 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) if(activeRooms.len) for(var/x in activeRooms) var/datum/turf_reservation/room = activeRooms[x] + var/turf/bottomLeft = room.bottom_left_turfs[1] for(var/i=0, i= SEC_LEVEL_RED) ? 1 : 0 + data["red_alert"] = (SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED) ? 1 : 0 data["emergency_maint"] = GLOB.emergency_access data["bsa_unlock"] = GLOB.bsa_unlock return data @@ -125,7 +125,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) deadchat_broadcast(" confirmed [event] at [span_name("[A2.name]")].", span_name("[confirmer]"), confirmer) switch(event) if(KEYCARD_RED_ALERT) - set_security_level(SEC_LEVEL_RED) + SSsecurity_level.set_level(SEC_LEVEL_RED) if(KEYCARD_EMERGENCY_MAINTENANCE_ACCESS) make_maint_all_access() if(KEYCARD_BSA_UNLOCK) diff --git a/code/modules/security_levels/level_interface.dm b/code/modules/security_levels/level_interface.dm index c840fa4400f0..01d22e0ef5e2 100644 --- a/code/modules/security_levels/level_interface.dm +++ b/code/modules/security_levels/level_interface.dm @@ -27,6 +27,10 @@ radio.listening = FALSE radio.independent = TRUE radio.recalculateChannels() + RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(update_security_level)) + +/obj/machinery/level_interface/proc/update_security_level() + update_appearance(UPDATE_ICON) /obj/machinery/level_interface/update_icon(updates=ALL) . = ..() @@ -37,7 +41,7 @@ /obj/machinery/level_interface/update_overlays() . = ..() - switch(GLOB.security_level) + switch(SSsecurity_level.get_current_level_as_number()) if(SEC_LEVEL_GREEN) . += "alert-level-green" if(SEC_LEVEL_BLUE) @@ -61,7 +65,7 @@ /obj/machinery/level_interface/ui_data(mob/user) var/list/data = ..() - data["alertLevel"] = GLOB.security_level + data["alertLevel"] = SSsecurity_level.get_current_level_as_number() return data /obj/machinery/level_interface/ui_act(action, list/params, mob/user) @@ -79,7 +83,7 @@ switch(action) if("set_level") - if(GLOB.security_level >= SEC_LEVEL_GAMMA) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_GAMMA) balloon_alert(usr, "Nanotrasen override in progress!") return TRUE if(!check_access(usr.get_idcard())) @@ -88,9 +92,9 @@ var/alert_level = params["level_number"] if(!isnum(alert_level)) return TRUE - if(!num2seclevel(alert_level)) + if(!SSsecurity_level.number_level_to_text(alert_level)) return TRUE - if(GLOB.security_level == alert_level) + if(SSsecurity_level.get_current_level_as_number() == alert_level) return TRUE for(var/obj/machinery/computer/communications/comms_console in GLOB.machines) if(!COOLDOWN_FINISHED(comms_console, important_action_cooldown)) @@ -99,11 +103,11 @@ return TRUE COOLDOWN_START(comms_console, important_action_cooldown, IMPORTANT_ACTION_COOLDOWN) break - set_security_level(num2seclevel(alert_level)) + SSsecurity_level.set_level(alert_level) var/username = "ERR_UNK" var/obj/item/card/id/id_card = usr.get_idcard() if(istype(id_card) && id_card && id_card.registered_name) username = id_card.registered_name - radio.talk_into(src, "Security level set to [uppertext(num2seclevel(alert_level))] by [username].", sec_freq) - radio.talk_into(src, "Security level set to [uppertext(num2seclevel(alert_level))] by [username].", command_freq) + radio.talk_into(src, "Security level set to [uppertext(SSsecurity_level.number_level_to_text(alert_level))] by [username].", sec_freq) + radio.talk_into(src, "Security level set to [uppertext(SSsecurity_level.number_level_to_text(alert_level))] by [username].", command_freq) return TRUE diff --git a/code/modules/security_levels/security_level_datums.dm b/code/modules/security_levels/security_level_datums.dm index 586e0b049df1..75c327d74249 100644 --- a/code/modules/security_levels/security_level_datums.dm +++ b/code/modules/security_levels/security_level_datums.dm @@ -29,6 +29,20 @@ var/lowering_to_configuration_key /// Our configuration key for elevating to text, if set, will override the default elevating to announcement. var/elevating_to_configuration_key + /// Custom title to use for announcement messages + var/custom_title + /// If the alert level should disable night mode + var/disable_night_mode = FALSE + /// If the emergency lights should be activiated + var/area_alarm = FALSE + /// If pods should be available for player launch + var/pod_access = FALSE + /// If red alert access doors should be unlocked + var/emergency_doors = FALSE + /// Are players allowed to cryo + var/allow_cryo = TRUE + /// Require providing a reason for a shuttle call at this alert level + var/require_call_reason = TRUE /datum/security_level/New() . = ..() @@ -37,6 +51,8 @@ if(elevating_to_configuration_key) elevating_to_announcement = global.config.Get(elevating_to_configuration_key) +/datum/security_level/proc/on_activate(previous_level) + /** * GREEN * @@ -49,6 +65,7 @@ number_level = SEC_LEVEL_GREEN lowering_to_configuration_key = /datum/config_entry/string/alert_green shuttle_call_time_mod = ALERT_COEFF_GREEN + require_call_reason = FALSE /** * BLUE @@ -77,45 +94,64 @@ lowering_to_configuration_key = /datum/config_entry/string/alert_red_downto elevating_to_configuration_key = /datum/config_entry/string/alert_red_upto shuttle_call_time_mod = ALERT_COEFF_RED - -/** - * DELTA - * - * Station destruction is imminent - */ -/datum/security_level/delta - name = "delta" - announcement_color = "purple" - sound = 'sound/misc/delta_alert.ogg' // Air alarm to signify importance - number_level = SEC_LEVEL_DELTA - elevating_to_configuration_key = /datum/config_entry/string/alert_delta - shuttle_call_time_mod = ALERT_COEFF_DELTA - + disable_night_mode = TRUE + pod_access = TRUE + emergency_doors = TRUE /** * GAMMA * - * Station is not having a very good fun time + * Station is under severe threat, but not threat of immediate destruction */ /datum/security_level/gamma name = "gamma" announcement_color = "orange" - sound = 'sound/misc/gamma_alert.ogg'// Air alarm to signify importance + sound = 'sound/misc/gamma_alert.ogg' number_level = SEC_LEVEL_GAMMA elevating_to_configuration_key = /datum/config_entry/string/alert_gamma - shuttle_call_time_mod = ALERT_COEFF_GAMMA - - + lowering_to_configuration_key = /datum/config_entry/string/alert_gamma + shuttle_call_time_mod = ALERT_COEFF_DELTA + disable_night_mode = TRUE + pod_access = TRUE + emergency_doors = TRUE + allow_cryo = FALSE /** * EPSILON * - * Station destruction is here, and you probably caused it, you monster. + * Death squad alert */ /datum/security_level/epsilon name = "epsilon" - announcement_color = "black" - sound = 'sound/misc/epsilon_alert.ogg'// Air alarm to signify importance + announcement_color = "grey" + sound = 'sound/misc/epsilon_alert.ogg' number_level = SEC_LEVEL_EPSILON elevating_to_configuration_key = /datum/config_entry/string/alert_epsilon + lowering_to_configuration_key = /datum/config_entry/string/alert_epsilon + custom_title = "Epsilon Protocol Activated" shuttle_call_time_mod = ALERT_COEFF_EPSILON + disable_night_mode = TRUE + pod_access = TRUE + emergency_doors = TRUE + allow_cryo = FALSE + +/datum/security_level/epsilon/on_activate(previous_level) + send_to_playing_players(span_notice("You get a bad feeling as you hear the Epsilon alert siren.")) + +/** + * DELTA + * + * Station destruction is imminent + */ +/datum/security_level/delta + name = "delta" + announcement_color = "purple" + sound = 'sound/misc/delta_alert.ogg' + number_level = SEC_LEVEL_DELTA + elevating_to_configuration_key = /datum/config_entry/string/alert_delta + shuttle_call_time_mod = ALERT_COEFF_DELTA + disable_night_mode = TRUE + area_alarm = TRUE + pod_access = TRUE + emergency_doors = TRUE + allow_cryo = FALSE diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm deleted file mode 100644 index 5b98ecb20220..000000000000 --- a/code/modules/security_levels/security_levels.dm +++ /dev/null @@ -1,167 +0,0 @@ -GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN) -//SEC_LEVEL_GREEN = code green -//SEC_LEVEL_BLUE = code blue -//SEC_LEVEL_RED = code red -//SEC_LEVEL_GAMMA = code gamma -//SEC_LEVEL_EPSILON = code epsilon -//SEC_LEVEL_DELTA = code delta - -//config.alert_desc_blue_downto - -//set all area lights on station level to red if true, do otherwise if false -/proc/change_areas_lights_alarm(red=TRUE) - if(red) - for(var/area/A in GLOB.delta_areas) - A.set_fire_alarm_effect(TRUE) - else - for(var/area/A in GLOB.delta_areas) - A.unset_fire_alarm_effects(TRUE) - -/proc/set_security_level(level) - switch(level) - if("green") - level = SEC_LEVEL_GREEN - if("blue") - level = SEC_LEVEL_BLUE - if("red") - level = SEC_LEVEL_RED - if("gamma") - level = SEC_LEVEL_GAMMA - if("epsilon") - level = SEC_LEVEL_EPSILON - if("delta") - level = SEC_LEVEL_DELTA - - //Will not be announced if you try to set to the same level as it already is - if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != GLOB.security_level) - var/modTimer - switch(level) - if(SEC_LEVEL_GREEN) - minor_announce(CONFIG_GET(string/alert_green), "Attention! Security level lowered to green:") - sound_to_playing_players('sound/misc/notice2.ogg') - if(GLOB.security_level >= SEC_LEVEL_RED) - modTimer = 4 - else - modTimer = 2 - - if(SEC_LEVEL_BLUE) - if(GLOB.security_level < SEC_LEVEL_BLUE) - minor_announce(CONFIG_GET(string/alert_blue_upto), "Attention! Security level elevated to blue:", TRUE) - sound_to_playing_players('sound/misc/notice1.ogg') - modTimer = 0.5 - else - minor_announce(CONFIG_GET(string/alert_blue_downto), "Attention! Security level lowered to blue:") - modTimer = 2 - - if(SEC_LEVEL_RED) - if(GLOB.security_level < SEC_LEVEL_RED) - minor_announce(CONFIG_GET(string/alert_red_upto), "Attention! Code red!", TRUE) - sound_to_playing_players('sound/misc/notice4.ogg') - if(GLOB.security_level == SEC_LEVEL_GREEN) - modTimer = 0.25 - else - modTimer = 0.5 - else - minor_announce(CONFIG_GET(string/alert_red_downto), "Attention! Code red!") - if(GLOB.security_level == SEC_LEVEL_GAMMA) - modTimer = 2 - - if(SEC_LEVEL_GAMMA) - minor_announce(CONFIG_GET(string/alert_gamma), "Attention! Gamma security level activated!", TRUE) - sound_to_playing_players('sound/misc/gamma_alert.ogg') - if(GLOB.security_level == SEC_LEVEL_GREEN) - modTimer = 0.25 - else if(GLOB.security_level == SEC_LEVEL_BLUE) - modTimer = 0.50 - else if(GLOB.security_level == SEC_LEVEL_RED) - modTimer = 0.75 - - if(SEC_LEVEL_EPSILON) - minor_announce(CONFIG_GET(string/alert_epsilon), "Attention! Epsilon security level reached!", TRUE) - sound_to_playing_players('sound/misc/epsilon_alert.ogg') - send_to_playing_players(span_notice("You get a bad feeling as you hear the Epsilon alert siren.")) - if(GLOB.security_level < SEC_LEVEL_EPSILON) - modTimer = 1 - - if(SEC_LEVEL_DELTA) - minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!", TRUE) - sound_to_playing_players('sound/misc/delta_alert.ogg') - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) - if(GLOB.security_level == SEC_LEVEL_GREEN) - modTimer = 0.25 - else if(GLOB.security_level == SEC_LEVEL_BLUE) - modTimer = 0.5 - - GLOB.security_level = level - for(var/obj/machinery/firealarm/FA in GLOB.machines) - if(is_station_level(FA.z)) - FA.update_appearance(UPDATE_ICON) - - for(var/obj/machinery/level_interface/LI in GLOB.machines) - LI.update_appearance(UPDATE_ICON) - - if(level >= SEC_LEVEL_RED) - for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines) - pod.admin_controlled = FALSE - for(var/obj/machinery/door/D in GLOB.machines) - if(D.red_alert_access) - D.visible_message(span_notice("[D] whirrs as it automatically lifts access requirements!")) - playsound(D, 'sound/machines/boltsup.ogg', 50, TRUE) - - if(level == SEC_LEVEL_DELTA) - change_areas_lights_alarm() - else - change_areas_lights_alarm(FALSE) - - if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) - SSshuttle.emergency.modTimer(modTimer) - - SSblackbox.record_feedback("tally", "security_level_changes", 1, get_security_level()) - SSnightshift.check_nightshift() - else - return - -/proc/get_security_level() - switch(GLOB.security_level) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_GAMMA) - return "gamma" - if(SEC_LEVEL_EPSILON) - return "epsilon" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/num2seclevel(num) - switch(num) - if(SEC_LEVEL_GREEN) - return "green" - if(SEC_LEVEL_BLUE) - return "blue" - if(SEC_LEVEL_RED) - return "red" - if(SEC_LEVEL_GAMMA) - return "gamma" - if(SEC_LEVEL_EPSILON) - return "epsilon" - if(SEC_LEVEL_DELTA) - return "delta" - -/proc/seclevel2num(seclevel) - switch( lowertext(seclevel) ) - if("green") - return SEC_LEVEL_GREEN - if("blue") - return SEC_LEVEL_BLUE - if("red") - return SEC_LEVEL_RED - if("gamma") - return SEC_LEVEL_GAMMA - if("epsilon") - return SEC_LEVEL_EPSILON - if("delta") - return SEC_LEVEL_DELTA diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index fb1d3d34c1ed..ea0583694272 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -227,14 +227,9 @@ /obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, area/signalOrigin, reason, set_coefficient=null) if(!isnum(set_coefficient)) - var/security_num = seclevel2num(get_security_level()) - switch(security_num) - if(SEC_LEVEL_GREEN) - set_coefficient = 2 - if(SEC_LEVEL_BLUE) - set_coefficient = 1 - else - set_coefficient = 0.5 + set_coefficient = SSsecurity_level.current_security_level.shuttle_call_time_mod + alert_coeff = set_coefficient + var/call_time = SSshuttle.emergency_call_time * set_coefficient * engine_coeff switch(mode) // The shuttle can not normally be called while "recalling", so @@ -253,7 +248,7 @@ SSshuttle.emergency_last_call_loc = null var/emergency_reason = "\nNature of emergency:\n\n[reason]" - priority_announce("The emergency shuttle has been called. [GLOB.security_level >= SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[html_decode(emergency_reason)][SSshuttle.emergency_last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLECALLED, "Priority") + priority_announce("The emergency shuttle has been called. [SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[html_decode(emergency_reason)][SSshuttle.emergency_last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]", null, ANNOUNCER_SHUTTLECALLED, "Priority") /obj/docking_port/mobile/emergency/cancel(area/signalOrigin) if(mode != SHUTTLE_CALL) @@ -479,7 +474,7 @@ var/obj/machinery/computer/shuttle/C = get_control_console() if(!istype(C, /obj/machinery/computer/shuttle/pod)) return ..() - if(GLOB.security_level >= SEC_LEVEL_RED || (C && (C.obj_flags & EMAGGED))) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED || (C && (C.obj_flags & EMAGGED))) if(launch_status == UNLAUNCHED) launch_status = EARLY_LAUNCHED return ..() @@ -492,7 +487,7 @@ /obj/machinery/computer/shuttle/pod name = "pod control computer" - admin_controlled = 1 + admin_controlled = TRUE possible_destinations = "pod_asteroid" icon = 'icons/obj/terminals.dmi' icon_state = "dorm_available" @@ -504,6 +499,9 @@ AddElement(/datum/element/update_icon_blocker) return ..() +/obj/machinery/computer/shuttle/pod/proc/update_security_level(_, datum/security_level/new_level) + admin_controlled = !new_level.pod_access + /obj/machinery/computer/shuttle/pod/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) return FALSE @@ -628,7 +626,7 @@ /obj/item/storage/pod/can_interact(mob/user) if(!..()) return FALSE - if(GLOB.security_level >= SEC_LEVEL_RED || unlocked) + if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED || unlocked) return TRUE to_chat(user, "The storage unit will only unlock during a Red or Delta security alert.") diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 5f5bb52270e7..0efa0520952d 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -50,10 +50,10 @@ All ShuttleMove procs go here //Destination turf changes //Baseturfs is definitely a list or this proc wouldnt be called var/shuttle_depth = depth_to_find_baseturf(/turf/baseturf_skipover/shuttle) - + if(!shuttle_depth) CRASH("A turf queued to move via shuttle somehow had no skipover in baseturfs. [src]([type]):[loc]") - newT.CopyOnTop(src, 1, shuttle_depth, TRUE, CHANGETURF_DEFER_CHANGE) + newT.CopyOnTop(src, 1, shuttle_depth, TRUE) SEND_SIGNAL(src, COMSIG_TURF_ON_SHUTTLE_MOVE, newT) return TRUE @@ -67,7 +67,7 @@ All ShuttleMove procs go here var/shuttle_depth = depth_to_find_baseturf(/turf/baseturf_skipover/shuttle) if(shuttle_depth) - oldT.ScrapeAway(shuttle_depth) + oldT.ScrapeAway(shuttle_depth, CHANGETURF_DEFER_CHANGE) if(rotation) shuttleRotate(rotation) //see shuttle_rotate.dm @@ -241,6 +241,11 @@ All ShuttleMove procs go here // atmosinit() calls update_appearance(UPDATE_ICON), so we don't need to call it update_appearance() +/obj/machinery/atmospherics/pipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) + . = ..() + //var/turf/T = loc + //hide(T.underfloor_accessibility < UNDERFLOOR_VISIBLE) + /obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() GLOB.navbeacons["[z]"] -= src @@ -248,6 +253,9 @@ All ShuttleMove procs go here /obj/machinery/navbeacon/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() + //var/turf/T = loc + //hide(T.underfloor_accessibility < UNDERFLOOR_VISIBLE) + if(codes["patrol"]) if(!GLOB.navbeacons["[z]"]) GLOB.navbeacons["[z]"] = list() @@ -256,6 +264,12 @@ All ShuttleMove procs go here GLOB.deliverybeacons += src GLOB.deliverybeacontags += location +/obj/machinery/power/terminal/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) + . = ..() + //var/turf/T = src.loc + //if(level==1) + //hide(T.underfloor_accessibility < UNDERFLOOR_VISIBLE) + /************************************Item move procs************************************/ /obj/item/storage/pod/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) @@ -311,6 +325,16 @@ All ShuttleMove procs go here if(. & MOVE_AREA) . |= MOVE_CONTENTS +/obj/structure/disposalpipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) + . = ..() + //update() + +/obj/structure/cable/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) + . = ..() + //var/turf/T = loc + //if(level==1) + //hide(T.underfloor_accessibility < UNDERFLOOR_VISIBLE) + /obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) diff --git a/code/modules/shuttle/ripple.dm b/code/modules/shuttle/ripple.dm index 912d95488862..19269c6a83ba 100644 --- a/code/modules/shuttle/ripple.dm +++ b/code/modules/shuttle/ripple.dm @@ -1,6 +1,6 @@ /obj/effect/abstract/ripple - name = "hyperspace ripple" - desc = "Something is coming through hyperspace, you can see the \ + name = "bluespace ripple" + desc = "Something is coming through bluespace, you can see the \ visual disturbances. It's probably best not to be on top of these \ when whatever is tunneling comes through." icon = 'icons/effects/effects.dmi' diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index bdd487ee37a0..3449b6f3b6df 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -928,6 +928,20 @@ last_timer_length *= multiple setTimer(time_remaining) +/obj/docking_port/mobile/proc/alert_coeff_change(new_coeff) + if(isnull(new_coeff)) + return + + var/time_multiplier = new_coeff / alert_coeff + var/time_remaining = timer - world.time + if(time_remaining < 0 || !last_timer_length) + return + + time_remaining *= time_multiplier + last_timer_length *= time_multiplier + alert_coeff = new_coeff + setTimer(time_remaining) + /obj/docking_port/mobile/proc/invertTimer() if(!last_timer_length) return diff --git a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm index c64f643b6dc7..6b93301c2b4c 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_upgrades.dm @@ -24,7 +24,7 @@ icon_state = "shuttledisk_void" upgrade_amount = 0.2 -/obj/item/shuttle_route_optimisation/attack_obj(obj/O, mob/living/user) +/obj/item/shuttle_route_optimisation/attack_atom(obj/O, mob/living/user) . = ..() if(!istype(O, /obj/machinery/computer)) return diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index d05758527ed0..ba49735c5d1a 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -182,7 +182,15 @@ max_integrity = 1000 var/boot_dir = 1 -/obj/structure/table/wood/bar/Crossed(atom/movable/AM) +/obj/structure/table/wood/bar/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + + +/obj/structure/table/wood/bar/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM) && !is_barstaff(AM)) // No climbing on the bar please var/mob/living/M = AM @@ -190,8 +198,6 @@ M.Paralyze(40) M.throw_at(throwtarget, 5, 1,src) to_chat(M, span_notice("No climbing on the bar please.")) - else - . = ..() /obj/structure/table/wood/bar/proc/is_barstaff(mob/living/user) . = FALSE diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index da9319e85371..1705ea972032 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -26,7 +26,10 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/structure/extraction_point, /obj/machinery/syndicatebomb, /obj/item/hilbertshotel, - /obj/structure/closet/bluespace // yogs - nope nice try + /obj/structure/closet/bluespace, // yogs - nope nice try + /obj/structure/disposalpipe, + /obj/structure/disposaloutlet, // connect outlet to bin, knock outlet onto shuttle, send it, enter bin + /obj/machinery/disposal ))) /obj/docking_port/mobile/supply diff --git a/code/modules/spells/spell_types/pointed/cast_iron.dm b/code/modules/spells/spell_types/pointed/cast_iron.dm new file mode 100644 index 000000000000..4cb7b094a2bf --- /dev/null +++ b/code/modules/spells/spell_types/pointed/cast_iron.dm @@ -0,0 +1,42 @@ +/datum/action/cooldown/spell/pointed/projectile/cast_iron + name = "Cast Iron" + desc = "This spell fires a cast iron bolt." + button_icon = 'yogstation/icons/obj/pan.dmi' + button_icon_state = "frying_pan" + + school = SCHOOL_EVOCATION + cooldown_time = 4 SECONDS + cooldown_reduction_per_rank = 0.6 SECONDS + + invocation = "CL'AHNG!" + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + active_msg = "You prepare to cast a cast iron!" + deactive_msg = "You decide to give these peasants a break." + cast_range = 8 + projectile_type = /obj/projectile/magic/cast_iron + +/datum/action/cooldown/spell/pointed/projectile/cast_iron/ready_projectile(obj/projectile/to_fire, atom/target, mob/user, iteration) + . = ..() + if(spell_level == spell_max_level) + to_fire.color = "#ffd700" + +/obj/projectile/magic/cast_iron + name = "cast iron" + icon = 'yogstation/icons/obj/pan.dmi' + icon_state = "frying_pan" + damage = 20 + damage_type = BRUTE + nodamage = FALSE + hitsound = 'yogstation/sound/weapons/pan.ogg' + stutter = 4 SECONDS + +/obj/projectile/magic/cast_iron/vol_by_damage() + return 100 // BONK! + +/obj/projectile/magic/cast_iron/on_hit(atom/target, blocked) + . = ..() + if(. && isliving(target)) + var/mob/living/victim = target + victim.adjust_confusion(4 SECONDS) diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm index 2580dc9910a8..498c4e308fa6 100644 --- a/code/modules/spells/spell_types/pointed/mind_transfer.dm +++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm @@ -64,7 +64,13 @@ to_chat(owner, span_warning("Swapping minds with your own guardian would just put you back into your own head!")) return FALSE + var/mob/living/living_target = cast_on + if(ishuman(living_target)) + var/mob/living/carbon/human/living_human = cast_on + if(is_synth(living_human)) + to_chat(owner, span_warning("This creature isn't alive in the regular sense, this wouldn't be a good idea.")) + return FALSE if(living_target.stat == DEAD) to_chat(owner, span_warning("You don't particularly want to be dead!")) return FALSE diff --git a/code/modules/spells/spell_types/pointed/scrunch.dm b/code/modules/spells/spell_types/pointed/scrunch.dm new file mode 100644 index 000000000000..5c9b5a58acc3 --- /dev/null +++ b/code/modules/spells/spell_types/pointed/scrunch.dm @@ -0,0 +1,43 @@ +/datum/action/cooldown/spell/pointed/scrunch + name = "Scrunch" + desc = "This spell scrunches a target." + button_icon = 'icons/mob/human.dmi' + button_icon_state = "human_basic" + ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi' + + school = SCHOOL_EVOCATION + cooldown_time = 30 SECONDS + cooldown_reduction_per_rank = 4 SECONDS // 4 second reduction per rank + + sound = 'sound/effects/gravhit.ogg' + invocation = "SCRUNCH!" //no modification, just scrunch + invocation_type = INVOCATION_SHOUT + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + + active_msg = "You prepare to scrunch!" + deactive_msg = "You decide to not scrunch." + cast_range = 8 + +/datum/action/cooldown/spell/pointed/scrunch/is_valid_target(atom/cast_on) + . = ..() + if(!.) + return FALSE + if(!iscarbon(cast_on)) + return FALSE + return TRUE + +/datum/action/cooldown/spell/pointed/scrunch/cast(mob/living/carbon/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("You feel... not scrunched.")) + to_chat(owner, span_warning("The spell had no effect!")) + return FALSE + + if(spell_level == spell_max_level) + cast_on.AddElement(/datum/element/squish) + cast_on.AddElement(/datum/element/squish) + cast_on.apply_damage(60, BRUTE, wound_bonus = 50, bare_wound_bonus = 50) //brute wounds all over the body + cast_on.emote("scream") + playsound(cast_on, 'sound/effects/blobattack.ogg', 40, TRUE) + playsound(cast_on, 'sound/effects/splat.ogg', 50, TRUE) + return TRUE diff --git a/code/modules/spells/spell_types/self/spacetime_distortion.dm b/code/modules/spells/spell_types/self/spacetime_distortion.dm index b41560aa1629..62e4edcc3d73 100644 --- a/code/modules/spells/spell_types/self/spacetime_distortion.dm +++ b/code/modules/spells/spell_types/self/spacetime_distortion.dm @@ -98,7 +98,7 @@ /obj/effect/cross_action name = "cross me" - desc = "for crossing" + desc = "For crossing." anchored = TRUE /obj/effect/cross_action/spacetime_dist diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 0932258445e5..c790f4900488 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -19,7 +19,7 @@ var/body_zone //BODY_ZONE_CHEST, BODY_ZONE_L_ARM, etc , used for def_zone var/aux_zone // used for hands var/aux_layer - var/body_part = null //bitflag used to check which clothes cover this bodypart + var/body_part = NONE //bitflag used to check which clothes cover this bodypart var/use_digitigrade = NOT_DIGITIGRADE //Used for alternate legs, useless elsewhere var/list/embedded_objects = list() var/held_index = 0 //are we a hand? if so, which one! @@ -460,7 +460,7 @@ // quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_wounding_mods() somehow if(ishuman(owner)) var/mob/living/carbon/human/human_wearer = owner - var/list/clothing = human_wearer.clothingonpart(src) + var/list/clothing = human_wearer.clothingonpart(body_part) for(var/i in clothing) var/obj/item/clothing/clothes_check = i // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary @@ -524,7 +524,7 @@ if(H?.physiology?.armor?.wound)//if there is any innate wound armor (poly or genetics) armor_ablation += H.physiology.armor.getRating(WOUND) - var/list/clothing = H.clothingonpart(src) + var/list/clothing = H.clothingonpart(body_part) for(var/c in clothing) var/obj/item/clothing/C = c // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary @@ -849,11 +849,15 @@ species_flags_list = S.species_traits if(S.use_skintones) - skin_tone = H.skin_tone + if(S.forced_skintone) + skin_tone = S.forced_skintone + else + skin_tone = H.skin_tone should_draw_greyscale = TRUE else skin_tone = "" + body_gender = H.gender should_draw_gender = S.sexes use_damage_color = S.use_damage_color diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index f49bc0901e32..a4de79fd173b 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -107,6 +107,8 @@ playsound(T, 'sound/misc/splort.ogg', 50, 1, -1) for(var/obj/item/I in src) if(I == brain) + if(!brain.can_extract()) + return if(user) user.visible_message(span_warning("[user] saws [src] open and pulls out a brain!"), span_notice("You saw [src] open and pull out a brain.")) if(brainmob) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 64bf4b260469..688e71d8d8cf 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -259,6 +259,8 @@ px_y = 12 max_stamina_damage = 50 can_be_disabled = TRUE + /// Used by the bloodysoles component to make footprints + var/footprint_sprite = FOOTPRINT_SPRITE_SHOES /obj/item/bodypart/l_leg/set_owner(new_owner) . = ..() @@ -315,6 +317,7 @@ animal_origin = MONKEY_BODYPART wound_resistance = -10 px_y = 4 + footprint_sprite = FOOTPRINT_SPRITE_PAWS /obj/item/bodypart/l_leg/alien icon = 'icons/mob/animal_parts.dmi' @@ -348,6 +351,8 @@ px_y = 12 max_stamina_damage = 50 can_be_disabled = TRUE + /// Used by the bloodysoles component to make footprints + var/footprint_sprite = FOOTPRINT_SPRITE_SHOES /obj/item/bodypart/r_leg/set_owner(new_owner) . = ..() @@ -404,6 +409,7 @@ animal_origin = MONKEY_BODYPART wound_resistance = -10 px_y = 4 + footprint_sprite = FOOTPRINT_SPRITE_PAWS /obj/item/bodypart/r_leg/alien icon = 'icons/mob/animal_parts.dmi' diff --git a/code/modules/surgery/ipc_revival.dm b/code/modules/surgery/ipc_revival.dm index ec8afe91de5f..aa207d104e94 100644 --- a/code/modules/surgery/ipc_revival.dm +++ b/code/modules/surgery/ipc_revival.dm @@ -88,3 +88,27 @@ -After reactivation, use a screwdriver to screw the panel back into place.
\ -If the unit breaks down shortly after reactivation, replace any missing internal components and reboot again if necessary.
\ Nanotrasen is not liable for any damages caused during the repair process." + +/datum/surgery/synth_revival + name = "Synthetic Reactivation" + desc = "This procedure reactivates a positronic brain inside a synthetic body, restoring it to a functional state." + icon_state = "revival_posi" + possible_locs = list(BODY_ZONE_HEAD) + ignore_clothes = TRUE + requires_bodypart_type = BODYPART_ROBOTIC + steps = list( + /datum/surgery_step/mechanic_open, + /datum/surgery_step/open_hatch, + /datum/surgery_step/revive_ipc, + /datum/surgery_step/mechanic_close + ) + +/datum/surgery/synth_revival/can_start(mob/user, mob/living/target) + if(target.stat != DEAD) + return FALSE // they're already activated + if(!is_synth(user)) + return FALSE + var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) + if(!B) // you can't reactivate a brain that DOESN'T EXIST + return FALSE + return istype(target.getorganslot(ORGAN_SLOT_BRAIN), /obj/item/organ/brain/positron) diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 59a27a606e5e..44e3a64a6017 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -129,8 +129,10 @@ else var/list/radial_menu = list() for(var/obj/item/organ/O in organs) + O.on_find(user) - radial_menu[O] = image(O) + if(O.can_extract()) + radial_menu[O] = image(O) I = show_radial_menu(user, target, radial_menu, tooltips = TRUE) if(I && user && target && user.Adjacent(target) && user.get_active_held_item() == tool) display_results(user, target, span_notice("You begin to extract [I] from [target]'s [parse_zone(target_zone)]..."), diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 1f018e8918e7..7a205f04602b 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -329,7 +329,6 @@ lefthand_file = active_tool.lefthand_file righthand_file = active_tool.righthand_file linkedarm.owner.update_inv_hands() - plane = 22 /obj/item/toolset_handler/attack_self(mob/user) linkedarm.ui_action_click() diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index c58ac8b27f2f..141ca0dcf30d 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -229,8 +229,6 @@ var/on = FALSE var/time_on = 0 var/hasexerted = FALSE - var/list/hsv - var/last_step = 0 COOLDOWN_DECLARE(alertcooldown) COOLDOWN_DECLARE(startsoundcooldown) COOLDOWN_DECLARE(endsoundcooldown) @@ -258,7 +256,7 @@ human.physiology.crawl_speed -= 1 owner.next_move_modifier *= 0.7 owner.add_movespeed_modifier("spinalimplant", priority=100, multiplicative_slowdown=-1) - RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(move_react)) + owner.AddComponent(/datum/component/after_image, 2 SECONDS, 0.5, TRUE) else if(COOLDOWN_FINISHED(src, endsoundcooldown)) playsound(owner, 'sound/effects/spinal_implant_off.ogg', 70) @@ -270,7 +268,8 @@ human.physiology.crawl_speed += 1 owner.next_move_modifier /= 0.7 owner.remove_movespeed_modifier("spinalimplant") - UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE) + var/datum/component/after_image = owner.GetComponent(/datum/component/after_image) + qdel(after_image) on = !on if(!silent) to_chat(owner, span_notice("You turn your spinal implant [on? "on" : "off"].")) @@ -285,15 +284,6 @@ for(var/datum/action/A as anything in actions) A.build_all_button_icons() -/obj/item/organ/cyberimp/chest/spinalspeed/proc/move_react()//afterimage - var/turf/currentloc = get_turf(owner) - var/obj/effect/temp_visual/decoy/fading/F = new(currentloc, owner) - if(!hsv) - hsv = RGBtoHSV(rgb(255, 0, 0)) - hsv = RotateHue(hsv, world.time - last_step * 15) - last_step = world.time - F.color = HSVtoRGB(hsv) //gotta add the flair - /obj/item/organ/cyberimp/chest/spinalspeed/on_life() if(!syndicate_implant)//the toy doesn't have a drawback return diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 067261c67490..67d77435c416 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -1,6 +1,6 @@ /obj/item/organ/cyberimp/eyes/hud name = "cybernetic hud" - desc = "artificial photoreceptors with specialized functionality" + desc = "A couple of artificial photoreceptors with specialized functionality." icon_state = "eye_implant" implant_overlay = "eye_implant_overlay" slot = ORGAN_SLOT_EYES diff --git a/code/modules/surgery/organs/ethereal_heart.dm b/code/modules/surgery/organs/ethereal_heart.dm index a3a157fc02c5..98f4f43e4906 100644 --- a/code/modules/surgery/organs/ethereal_heart.dm +++ b/code/modules/surgery/organs/ethereal_heart.dm @@ -210,7 +210,7 @@ being_built = FALSE update_icon() -/obj/structure/ethereal_crystal/obj_destruction(damage_flag) +/obj/structure/ethereal_crystal/atom_destruction(damage_flag) playsound(get_turf(ethereal_heart.owner), 'sound/effects/ethereal_revive_fail.ogg', 100) return ..() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 7be34b681780..10cb00b9f812 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -42,16 +42,17 @@ HMN.eye_color = eye_color else eye_color = HMN.eye_color + HMN.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) //updates eye icon + HMN.update_body() M.update_tint() owner.update_sight() - if(M.has_dna() && ishuman(M)) - M.dna.species.handle_body(M) //updates eye icon /obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0) ..() if(ishuman(M) && eye_color) var/mob/living/carbon/human/HMN = M HMN.eye_color = old_eye_color + HMN.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) HMN.update_body() M.cure_blind(list(EYE_DAMAGE)) // can't be blind from eye damage if there's no eye to be damaged, still blind from not having eyes though M.cure_nearsighted(list(EYE_DAMAGE)) // likewise for nearsightedness @@ -172,6 +173,12 @@ medium_light_cutoff = list(0, 20, 35) high_light_cutoff = list(0, 40, 50) +/obj/item/organ/eyes/zombie + name = "undead eyes" + desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) + lighting_cutoff = LIGHTING_CUTOFF_HIGH + //innate nightvision eyes /obj/item/organ/eyes/alien name = "alien eyes" @@ -180,12 +187,6 @@ color_cutoffs = list(25, 5, 42) lighting_cutoff = LIGHTING_CUTOFF_HIGH -/obj/item/organ/eyes/zombie - name = "undead eyes" - desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." - color_cutoffs = list(25, 35, 5) - lighting_cutoff = LIGHTING_CUTOFF_HIGH - /obj/item/organ/eyes/shadow name = "burning red eyes" desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." @@ -243,7 +244,7 @@ sight_flags = SEE_MOBS // We're gonna downshift green and blue a bit so darkness looks yellow color_cutoffs = list(25, 8, 5) - flash_protect = -1 + flash_protect = FLASH_PROTECTION_SENSITIVE /obj/item/organ/eyes/robotic/flashlight name = "flashlight eyes" @@ -279,7 +280,7 @@ /obj/item/organ/eyes/robotic/shield name = "shielded robotic eyes" desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." - flash_protect = 2 + flash_protect = FLASH_PROTECTION_WELDER /obj/item/organ/eyes/robotic/shield/emp_act(severity) return @@ -476,6 +477,9 @@ if(!isnull(light_flags)) set_light_flags(light_flags) +/obj/item/organ/eyes/robotic/synth + flash_protect = 2 + /obj/item/organ/eyes/moth name = "moth eyes" desc = "These eyes can see just a little too well, light doesn't entirely agree with them." diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 0a356759507b..e4cfbbe821f0 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -75,6 +75,10 @@ /obj/item/organ/proc/on_find(mob/living/finder) return +/obj/item/organ/proc/can_extract(mob/living/finder) + return TRUE + + /obj/item/organ/process() //runs decay when outside of a person if((organ_flags & (ORGAN_SYNTHETIC | ORGAN_FROZEN)) || istype(loc, /obj/item/mmi)) return diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 3377c06405ef..331e34447ec6 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -151,7 +151,7 @@ . = ..() if(HAS_TRAIT(stomach_owner, TRAIT_POWERHUNGRY)) stomach_owner.nutrition = stored_charge - RegisterSignal(stomach_owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge)) + RegisterSignal(stomach_owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(charge), override = TRUE) /obj/item/organ/stomach/cell/Remove(mob/living/carbon/stomach_owner, special) . = ..() diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm index 5ea7c1175016..762289a123b8 100644 --- a/code/modules/surgery/organs/tails.dm +++ b/code/modules/surgery/organs/tails.dm @@ -19,6 +19,9 @@ /obj/item/organ/tail/get_availability(datum/species/species) return (HAS_TAIL in species.species_traits) +/obj/item/organ/tail/proc/get_butt_sprite() + return null + /obj/item/organ/tail/cat name = "cat tail" desc = "A severed cat tail. Who's wagging now?" @@ -43,6 +46,9 @@ color = H.hair_color H.update_body() +/obj/item/organ/tail/cat/get_butt_sprite() + return BUTT_SPRITE_CAT + /obj/item/organ/tail/lizard name = "lizard tail" desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index c2394a19d583..223e09bfe126 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -49,6 +49,8 @@ ..() if(surgery_target) target = surgery_target + if(is_synth(target)) + ignore_clothes = TRUE target.surgeries += src if(surgery_location) location = surgery_location diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 985e0397a275..211f195938d6 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -241,6 +241,7 @@ /obj/item/circular_saw/Initialize(mapload) . = ..() + AddComponent(/datum/component/cleave_attack) AddComponent(/datum/component/butchering, 40 * toolspeed, 100, 5, 'sound/weapons/circsawhit.ogg') //saws are very accurate and fast at butchering /obj/item/circular_saw/attack(mob/living/M, mob/user) @@ -406,6 +407,9 @@ demolition_mod = 1.5 // lasers are good at cutting metal sharpness = SHARP_EDGED +/obj/item/scalpel/advanced/Initialize(mapload) + . = ..() + AddComponent(/datum/component/cleave_attack) // woe, angry medbay be upon ye /obj/item/scalpel/advanced/attack_self(mob/user) playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE) diff --git a/code/modules/swarmers/swarmer_objs.dm b/code/modules/swarmers/swarmer_objs.dm index c5801983b834..2de324d3329a 100644 --- a/code/modules/swarmers/swarmer_objs.dm +++ b/code/modules/swarmers/swarmer_objs.dm @@ -108,7 +108,14 @@ max_integrity = 10 density = FALSE -/obj/structure/swarmer/trap/Crossed(atom/movable/AM) +/obj/structure/swarmer/trap/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/structure/swarmer/trap/proc/on_entered(datum/source, atom/movable/AM, ...) if(isliving(AM)) var/mob/living/living_crosser = AM if(!istype(living_crosser, /mob/living/simple_animal/hostile/swarmer)) @@ -117,7 +124,7 @@ if(iscyborg(living_crosser)) living_crosser.Paralyze(100) qdel(src) - return ..() + return /obj/structure/swarmer/blockade name = "swarmer blockade" diff --git a/code/modules/tgs/LICENSE b/code/modules/tgs/LICENSE index 221f9e1deb21..85bca8c3f814 100644 --- a/code/modules/tgs/LICENSE +++ b/code/modules/tgs/LICENSE @@ -1,24 +1,24 @@ -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The MIT License + +Copyright (c) 2017-2023 Jordan Brown + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/code/modules/tgs/core/_definitions.dm b/code/modules/tgs/core/_definitions.dm index ebf6d17c2a07..fd98034eb716 100644 --- a/code/modules/tgs/core/_definitions.dm +++ b/code/modules/tgs/core/_definitions.dm @@ -1,2 +1,10 @@ +#if DM_VERSION < 510 +#error The TGS DMAPI does not support BYOND versions < 510! +#endif + #define TGS_UNIMPLEMENTED "___unimplemented" #define TGS_VERSION_PARAMETER "server_service_version" + +#ifndef TGS_DEBUG_LOG +#define TGS_DEBUG_LOG(message) +#endif diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 41a047339452..15622228e91f 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -42,11 +42,11 @@ var/datum/tgs_version/max_api_version = TgsMaximumApiVersion(); if(version.suite != null && version.minor != null && version.patch != null && version.deprecated_patch != null && version.deprefixed_parameter > max_api_version.deprefixed_parameter) - TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.") + TGS_ERROR_LOG("Detected unknown Interop API version! Defaulting to latest. Update the DMAPI to fix this problem.") api_datum = /datum/tgs_api/latest if(!api_datum) - TGS_ERROR_LOG("Found unsupported API version: [raw_parameter]. If this is a valid version please report this, backporting is done on demand.") + TGS_ERROR_LOG("Found unsupported Interop API version: [raw_parameter]. If this is a valid version please report this, backporting is done on demand.") return TGS_INFO_LOG("Activating API for version [version.deprefixed_parameter]") @@ -107,6 +107,13 @@ if(api) return api.ApiVersion() +/world/TgsEngine() +#ifdef OPENDREAM + return TGS_ENGINE_TYPE_OPENDREAM +#else + return TGS_ENGINE_TYPE_BYOND +#endif + /world/TgsInstanceName() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) @@ -153,4 +160,17 @@ /world/TgsSecurityLevel() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) - api.SecurityLevel() + return api.SecurityLevel() + +/world/TgsVisibility() + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.Visibility() + +/world/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + if(!istype(parameters, /list)) + parameters = list() + + return api.TriggerEvent(event_name, parameters, wait_for_completion) diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 68b0330fe860..898516f12486 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -11,6 +11,15 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) src.event_handler = event_handler src.version = version +/datum/tgs_api/proc/TerminateWorld() + while(TRUE) + TGS_DEBUG_LOG("About to terminate world. Tick: [world.time], sleep_offline: [world.sleep_offline]") + world.sleep_offline = FALSE // https://www.byond.com/forum/post/2894866 + del(world) + world.sleep_offline = FALSE // just in case, this is BYOND after all... + sleep(world.tick_lag) + TGS_DEBUG_LOG("BYOND DIDN'T TERMINATE THE WORLD!!! TICK IS: [world.time], sleep_offline: [world.sleep_offline]") + /datum/tgs_api/latest parent_type = /datum/tgs_api/v5 @@ -57,3 +66,9 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/Visibility() + return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/TriggerEvent(event_name, list/parameters, wait_for_completion) + return FALSE diff --git a/code/modules/tgs/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm index d9bd287465b9..e65c816320dc 100644 --- a/code/modules/tgs/v3210/commands.dm +++ b/code/modules/tgs/v3210/commands.dm @@ -47,7 +47,7 @@ user.friendly_name = sender // Discord hack, fix the mention if it's only numbers (fuck you IRC trolls) - var/regex/discord_id_regex = regex(@"^[0-9]+$") + var/regex/discord_id_regex = regex("^\[0-9\]+$") if(findtext(sender, discord_id_regex)) sender = "<@[sender]>" @@ -55,4 +55,4 @@ var/datum/tgs_message_content/result = stc.Run(user, params) result = UpgradeDeprecatedCommandResponse(result, command) - return result?.text || TRUE + return result ? result.text : TRUE diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index b9a75c4abb48..7c87922750b9 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -73,7 +73,7 @@ if(cached_json["apiValidateOnly"]) TGS_INFO_LOG("Validating API and exiting...") Export(TGS4_COMM_VALIDATE, list(TGS4_PARAMETER_DATA = "[minimum_required_security_level]")) - del(world) + TerminateWorld() security_level = cached_json["securityLevel"] chat_channels_json_path = cached_json["chatChannelsJson"] @@ -181,14 +181,14 @@ var/json = json_encode(data) while(requesting_new_port && !override_requesting_new_port) - sleep(1) + sleep(world.tick_lag) //we need some port open at this point to facilitate return communication if(!world.port) requesting_new_port = TRUE if(!world.OpenPort(0)) //open any port TGS_ERROR_LOG("Unable to open random port to retrieve new port![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() //request a new port export_lock = FALSE @@ -196,20 +196,20 @@ if(!new_port_json) TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() var/new_port = new_port_json[TGS4_PARAMETER_DATA] if(!isnum(new_port) || new_port <= 0) TGS_ERROR_LOG("Malformed new port json ([json_encode(new_port_json)])![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() if(new_port != world.port && !world.OpenPort(new_port)) TGS_ERROR_LOG("Unable to open port [new_port]![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() requesting_new_port = FALSE while(export_lock) - sleep(1) + sleep(world.tick_lag) export_lock = TRUE last_interop_response = null @@ -217,7 +217,7 @@ text2file(json, server_commands_json_path) for(var/I = 0; I < EXPORT_TIMEOUT_DS && !last_interop_response; ++I) - sleep(1) + sleep(world.tick_lag) if(!last_interop_response) TGS_ERROR_LOG("Failed to get export result for: [json]") diff --git a/code/modules/tgs/v4/commands.dm b/code/modules/tgs/v4/commands.dm index d6d3d718d471..25dd6740e3af 100644 --- a/code/modules/tgs/v4/commands.dm +++ b/code/modules/tgs/v4/commands.dm @@ -40,5 +40,5 @@ var/datum/tgs_message_content/result = sc.Run(u, params) result = UpgradeDeprecatedCommandResponse(result, command) - return result?.text + return result ? result.text : TRUE return "Unknown command: [command]!" diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 5d3d491a7362..f4806f7adb97 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.6.1" +"5.9.0" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index a3f949081f16..92c7a8388a71 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -5,19 +5,20 @@ #define DMAPI5_TOPIC_DATA "tgs_data" #define DMAPI5_BRIDGE_REQUEST_LIMIT 8198 -#define DMAPI5_TOPIC_REQUEST_LIMIT 65529 -#define DMAPI5_TOPIC_RESPONSE_LIMIT 65528 +#define DMAPI5_TOPIC_REQUEST_LIMIT 65528 +#define DMAPI5_TOPIC_RESPONSE_LIMIT 65529 -#define DMAPI5_BRIDGE_COMMAND_PORT_UPDATE 0 #define DMAPI5_BRIDGE_COMMAND_STARTUP 1 #define DMAPI5_BRIDGE_COMMAND_PRIME 2 #define DMAPI5_BRIDGE_COMMAND_REBOOT 3 #define DMAPI5_BRIDGE_COMMAND_KILL 4 #define DMAPI5_BRIDGE_COMMAND_CHAT_SEND 5 #define DMAPI5_BRIDGE_COMMAND_CHUNK 6 +#define DMAPI5_BRIDGE_COMMAND_EVENT 7 #define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" #define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" +#define DMAPI5_PARAMETER_TOPIC_PORT "topicPort" #define DMAPI5_CHUNK "chunk" #define DMAPI5_CHUNK_PAYLOAD "payload" @@ -34,6 +35,7 @@ #define DMAPI5_BRIDGE_PARAMETER_VERSION "version" #define DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE "chatMessage" #define DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL "minimumSecurityLevel" +#define DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION "eventInvocation" #define DMAPI5_BRIDGE_RESPONSE_NEW_PORT "newPort" #define DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION "runtimeInformation" @@ -48,6 +50,7 @@ #define DMAPI5_RUNTIME_INFORMATION_REVISION "revision" #define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges" #define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel" +#define DMAPI5_RUNTIME_INFORMATION_VISIBILITY "visibility" #define DMAPI5_CHAT_UPDATE_CHANNELS "channels" @@ -75,10 +78,12 @@ #define DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED 4 #define DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE 5 #define DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE 6 -#define DMAPI5_TOPIC_COMMAND_HEARTBEAT 7 +#define DMAPI5_TOPIC_COMMAND_HEALTHCHECK 7 #define DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH 8 #define DMAPI5_TOPIC_COMMAND_SEND_CHUNK 9 #define DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK 10 +#define DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST 11 +#define DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT 12 #define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType" #define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand" @@ -88,6 +93,7 @@ #define DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME "newInstanceName" #define DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE "chatUpdate" #define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion" +#define DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE "broadcastMessage" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE "commandResponse" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage" @@ -113,3 +119,9 @@ #define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name" #define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText" #define DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY "adminOnly" + +#define DMAPI5_EVENT_ID "eventId" + +#define DMAPI5_EVENT_INVOCATION_NAME "eventName" +#define DMAPI5_EVENT_INVOCATION_PARAMETERS "parameters" +#define DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION "notifyCompletion" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 926ea10a8f27..95b8edd3ee5c 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -4,11 +4,16 @@ var/instance_name var/security_level + var/visibility var/reboot_mode = TGS_REBOOT_MODE_NORMAL + /// List of chat messages list()s that attempted to be sent during a topic call. To be bundled in the result of the call var/list/intercepted_message_queue + /// List of chat messages list()s that attempted to be sent during a topic call. To be bundled in the result of the call + var/list/offline_message_queue + var/list/custom_commands var/list/test_merges @@ -16,24 +21,38 @@ var/list/chat_channels var/initialized = FALSE + var/initial_bridge_request_received = FALSE + var/datum/tgs_version/interop_version var/chunked_requests = 0 var/list/chunked_topics = list() + var/list/pending_events = list() + var/detached = FALSE +/datum/tgs_api/v5/New() + . = ..() + interop_version = version + TGS_DEBUG_LOG("V5 API created: [json_encode(args)]") + /datum/tgs_api/v5/ApiVersion() return new /datum/tgs_version( #include "__interop_version.dm" ) /datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) + TGS_DEBUG_LOG("OnWorldNew()") server_port = world.params[DMAPI5_PARAM_SERVER_PORT] access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER] var/datum/tgs_version/api_version = ApiVersion() - version = null - var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) + version = null // we want this to be the TGS version, not the interop version + + // sleep once to prevent an issue where world.Export on the first tick can hang indefinitely + sleep(world.tick_lag) + + var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands(), DMAPI5_PARAMETER_TOPIC_PORT = GetTopicPort())) if(!istype(bridge_response)) TGS_ERROR_LOG("Failed initial bridge request!") return FALSE @@ -45,10 +64,12 @@ if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY]) TGS_INFO_LOG("DMAPI validation, exiting...") - del(world) + TerminateWorld() - version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) + initial_bridge_request_received = TRUE + version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) // reassigning this because it can change if TGS updates security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] + visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] @@ -95,18 +116,36 @@ initialized = TRUE return TRUE +/datum/tgs_api/v5/proc/GetTopicPort() +#if defined(OPENDREAM) && defined(OPENDREAM_TOPIC_PORT_EXISTS) + return "[world.opendream_topic_port]" +#else + return null +#endif + /datum/tgs_api/v5/proc/RequireInitialBridgeResponse() - while(!version) - sleep(1) + TGS_DEBUG_LOG("RequireInitialBridgeResponse()") + var/logged = FALSE + while(!initial_bridge_request_received) + if(!logged) + TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep") + logged = TRUE + + sleep(world.tick_lag) + + TGS_DEBUG_LOG("RequireInitialBridgeResponse: Passed") /datum/tgs_api/v5/OnInitializationComplete() Bridge(DMAPI5_BRIDGE_COMMAND_PRIME) /datum/tgs_api/v5/OnTopic(T) + TGS_DEBUG_LOG("OnTopic()") RequireInitialBridgeResponse() + TGS_DEBUG_LOG("OnTopic passed bridge request gate") var/list/params = params2list(T) var/json = params[DMAPI5_TOPIC_DATA] if(!json) + TGS_DEBUG_LOG("No \"[DMAPI5_TOPIC_DATA]\" entry found, ignoring...") return FALSE // continue to /world/Topic if(!initialized) @@ -156,7 +195,7 @@ TGS_WARNING_LOG("Received legacy string when a [/datum/tgs_message_content] was expected. Please audit all calls to TgsChatBroadcast, TgsChatTargetedBroadcast, and TgsChatPrivateMessage to ensure they use the new /datum.") return new /datum/tgs_message_content(message) -/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message, list/channels) +/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message2, list/channels) if(!length(channels)) channels = ChatChannelInfo() @@ -165,52 +204,93 @@ var/datum/tgs_chat_channel/channel = I ids += channel.id - message = UpgradeDeprecatedChatMessage(message) + SendChatMessageRaw(message2, ids) - if (!length(channels)) - return - - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids - if(intercepted_message_queue) - intercepted_message_queue += list(message) - else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) - -/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only) +/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message2, admin_only) var/list/channels = list() for(var/I in ChatChannelInfo()) var/datum/tgs_chat_channel/channel = I if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id - message = UpgradeDeprecatedChatMessage(message) + SendChatMessageRaw(message2, channels) + +/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message2, datum/tgs_chat_user/user) + SendChatMessageRaw(message2, list(user.channel.id)) - if (!length(channels)) +/datum/tgs_api/v5/proc/SendChatMessageRaw(datum/tgs_message_content/message2, list/channel_ids) + message2 = UpgradeDeprecatedChatMessage(message2) + + if (!length(channel_ids)) return - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channel_ids if(intercepted_message_queue) - intercepted_message_queue += list(message) - else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + intercepted_message_queue += list(data) + return -/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user) - message = UpgradeDeprecatedChatMessage(message) - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id) - if(intercepted_message_queue) - intercepted_message_queue += list(message) + if(offline_message_queue) + offline_message_queue += list(data) + return + + if(detached) + offline_message_queue = list(data) + + WaitForReattach(FALSE) + + data = offline_message_queue + offline_message_queue = null + + for(var/queued_message in data) + SendChatDataRaw(queued_message) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + SendChatDataRaw(data) + +/datum/tgs_api/v5/proc/SendChatDataRaw(list/data) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) /datum/tgs_api/v5/ChatChannelInfo() RequireInitialBridgeResponse() WaitForReattach(TRUE) return chat_channels.Copy() +/datum/tgs_api/v5/TriggerEvent(event_name, list/parameters, wait_for_completion) + RequireInitialBridgeResponse() + WaitForReattach(TRUE) + + if(interop_version.minor < 9) + TGS_WARNING_LOG("Interop version too low for custom events!") + return FALSE + + var/str_parameters = list() + for(var/i in parameters) + str_parameters += "[i]" + + var/list/response = Bridge(DMAPI5_BRIDGE_COMMAND_EVENT, list(DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION = list(DMAPI5_EVENT_INVOCATION_NAME = event_name, DMAPI5_EVENT_INVOCATION_PARAMETERS = str_parameters, DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION = wait_for_completion))) + if(!response) + return FALSE + + var/event_id = response[DMAPI5_EVENT_ID] + if(!event_id) + return FALSE + + TGS_DEBUG_LOG("Created event ID: [event_id]") + if(!wait_for_completion) + return TRUE + + TGS_DEBUG_LOG("Waiting for completion of event ID: [event_id]") + + while(!pending_events[event_id]) + sleep(world.tick_lag) + + TGS_DEBUG_LOG("Completed wait on event ID: [event_id]") + pending_events -= event_id + + return TRUE + /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) + TGS_DEBUG_LOG("DecodeChannels()") var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS] if(istype(chat_channels_json)) chat_channels.Cut() @@ -235,3 +315,7 @@ /datum/tgs_api/v5/SecurityLevel() RequireInitialBridgeResponse() return security_level + +/datum/tgs_api/v5/Visibility() + RequireInitialBridgeResponse() + return visibility diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm index 37f58bcdf632..0c5e701a32b6 100644 --- a/code/modules/tgs/v5/bridge.dm +++ b/code/modules/tgs/v5/bridge.dm @@ -48,7 +48,9 @@ var/json = CreateBridgeData(command, data, TRUE) var/encoded_json = url_encode(json) - var/url = "http://127.0.0.1:[server_port]/Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]" + var/api_prefix = interop_version.minor >= 8 ? "api/" : "" + + var/url = "http://127.0.0.1:[server_port]/[api_prefix]Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]" return url /datum/tgs_api/v5/proc/CreateBridgeData(command, list/data, needs_auth) @@ -63,7 +65,7 @@ if(detached) // Wait up to one minute for(var/i in 1 to 600) - sleep(1) + sleep(world.tick_lag) if(!detached && (!require_channels || length(chat_channels))) break @@ -75,17 +77,25 @@ /datum/tgs_api/v5/proc/PerformBridgeRequest(bridge_request) WaitForReattach(FALSE) + TGS_DEBUG_LOG("Bridge request start") // This is an infinite sleep until we get a response var/export_response = world.Export(bridge_request) + TGS_DEBUG_LOG("Bridge request complete") + if(!export_response) TGS_ERROR_LOG("Failed bridge request: [bridge_request]") return - var/response_json = file2text(export_response["CONTENT"]) - if(!response_json) + var/content = export_response["CONTENT"] + if(!content) TGS_ERROR_LOG("Failed bridge request, missing content!") return + var/response_json = TGS_FILE2TEXT_NATIVE(content) + if(!response_json) + TGS_ERROR_LOG("Failed bridge request, failed to load content!") + return + var/list/bridge_response = json_decode(response_json) if(!bridge_response) TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]") diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm index a832c81f172d..9557f8a08ed5 100644 --- a/code/modules/tgs/v5/commands.dm +++ b/code/modules/tgs/v5/commands.dm @@ -35,10 +35,10 @@ if(sc) var/datum/tgs_message_content/response = sc.Run(u, params) response = UpgradeDeprecatedCommandResponse(response, command) - + var/list/topic_response = TopicResponse() - topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response?.text - topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response?._interop_serialize() + topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response ? response.text : null + topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response ? response._interop_serialize() : null return topic_response return TopicResponse("Unknown custom chat command: [command]!") diff --git a/code/modules/tgs/v5/serializers.dm b/code/modules/tgs/v5/serializers.dm index 7f9bc731b792..3a32848ad512 100644 --- a/code/modules/tgs/v5/serializers.dm +++ b/code/modules/tgs/v5/serializers.dm @@ -1,12 +1,12 @@ /datum/tgs_message_content/proc/_interop_serialize() - return list("text" = text, "embed" = embed?._interop_serialize()) + return list("text" = text, "embed" = embed ? embed._interop_serialize() : null) /datum/tgs_chat_embed/proc/_interop_serialize() CRASH("Base /proc/interop_serialize called on [type]!") /datum/tgs_chat_embed/structure/_interop_serialize() var/list/serialized_fields - if(islist(fields)) + if(istype(fields, /list)) serialized_fields = list() for(var/datum/tgs_chat_embed/field/field as anything in fields) serialized_fields += list(field._interop_serialize()) @@ -16,12 +16,12 @@ "url" = url, "timestamp" = timestamp, "colour" = colour, - "image" = image?._interop_serialize(), - "thumbnail" = thumbnail?._interop_serialize(), - "video" = video?._interop_serialize(), - "footer" = footer?._interop_serialize(), - "provider" = provider?._interop_serialize(), - "author" = author?._interop_serialize(), + "image" = src.image ? src.image._interop_serialize() : null, + "thumbnail" = thumbnail ? thumbnail._interop_serialize() : null, + "video" = video ? video._interop_serialize() : null, + "footer" = footer ? footer._interop_serialize() : null, + "provider" = provider ? provider._interop_serialize() : null, + "author" = author ? author._interop_serialize() : null, "fields" = serialized_fields ) @@ -43,7 +43,7 @@ . = ..() .["iconUrl"] = icon_url .["proxyIconUrl"] = proxy_icon_url - + /datum/tgs_chat_embed/footer/_interop_serialize() return list( "text" = text, diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm index 3779db6237a3..e1f2cb638578 100644 --- a/code/modules/tgs/v5/topic.dm +++ b/code/modules/tgs/v5/topic.dm @@ -5,6 +5,7 @@ return response /datum/tgs_api/v5/proc/ProcessTopicJson(json, check_access_identifier) + TGS_DEBUG_LOG("ProcessTopicJson(..., [check_access_identifier])") var/list/result = ProcessRawTopic(json, check_access_identifier) if(!result) result = TopicResponse("Runtime error!") @@ -25,16 +26,20 @@ return response_json /datum/tgs_api/v5/proc/ProcessRawTopic(json, check_access_identifier) + TGS_DEBUG_LOG("ProcessRawTopic(..., [check_access_identifier])") var/list/topic_parameters = json_decode(json) if(!topic_parameters) + TGS_DEBUG_LOG("ProcessRawTopic: json_decode failed") return TopicResponse("Invalid topic parameters json: [json]!"); var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] if(check_access_identifier && their_sCK != access_identifier) - return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER]!") + TGS_DEBUG_LOG("ProcessRawTopic: access identifier check failed") + return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] or it does not match!") var/command = topic_parameters[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE] if(!isnum(command)) + TGS_DEBUG_LOG("ProcessRawTopic: command type check failed") return TopicResponse("Failed to decode [DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE]!") return ProcessTopicCommand(command, topic_parameters) @@ -43,6 +48,7 @@ return "response[payload_id]" /datum/tgs_api/v5/proc/ProcessTopicCommand(command, list/topic_parameters) + TGS_DEBUG_LOG("ProcessTopicCommand([command], ...)") switch(command) if(DMAPI5_TOPIC_COMMAND_CHAT_COMMAND) @@ -55,7 +61,6 @@ return result if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION) - intercepted_message_queue = list() var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION] if(!istype(event_notification)) return TopicResponse("Invalid [DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]!") @@ -66,28 +71,30 @@ var/list/event_parameters = event_notification[DMAPI5_EVENT_NOTIFICATION_PARAMETERS] if(event_parameters && !istype(event_parameters)) - return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!") + . = TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!") + else + var/list/response = TopicResponse() + . = response + if(event_handler != null) + var/list/event_call = list(event_type) + if(event_parameters) + event_call += event_parameters + + intercepted_message_queue = list() + event_handler.HandleEvent(arglist(event_call)) + response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue + intercepted_message_queue = null - var/list/event_call = list(event_type) if (event_type == TGS_EVENT_WATCHDOG_DETACH) detached = TRUE chat_channels.Cut() // https://github.com/tgstation/tgstation-server/issues/1490 - if(event_parameters) - event_call += event_parameters - - if(event_handler != null) - event_handler.HandleEvent(arglist(event_call)) - - var/list/response = TopicResponse() - response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue - intercepted_message_queue = null - return response + return if(DMAPI5_TOPIC_COMMAND_CHANGE_PORT) var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] if (!isnum(new_port) || !(new_port > 0)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]") if(event_handler != null) event_handler.HandleEvent(TGS_EVENT_PORT_SWAP, new_port) @@ -122,8 +129,10 @@ return TopicResponse() if(DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE) + TGS_DEBUG_LOG("ProcessTopicCommand: It's a chat update") var/list/chat_update_json = topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE] if(!istype(chat_update_json)) + TGS_DEBUG_LOG("ProcessTopicCommand: failed \"[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]\" check") return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]!") DecodeChannels(chat_update_json) @@ -132,12 +141,14 @@ if(DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE) var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] if (!isnum(new_port) || !(new_port > 0)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]") server_port = new_port return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_HEARTBEAT) + if(DMAPI5_TOPIC_COMMAND_HEALTHCHECK) + if(event_handler && event_handler.receive_health_checks) + event_handler.HandleEvent(TGS_EVENT_HEALTH_CHECK) return TopicResponse() if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) @@ -146,7 +157,7 @@ var/error_message = null if (new_port != null) if (!isnum(new_port) || !(new_port > 0)) - error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]" + error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]" else server_port = new_port @@ -154,7 +165,7 @@ if (!istext(new_version_string)) if(error_message != null) error_message += ", " - error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]" + error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]" else var/datum/tgs_version/new_version = new(new_version_string) if (event_handler) @@ -164,6 +175,11 @@ var/list/reattach_response = TopicResponse(error_message) reattach_response[DMAPI5_PARAMETER_CUSTOM_COMMANDS] = ListCustomCommands() + reattach_response[DMAPI5_PARAMETER_TOPIC_PORT] = GetTopicPort() + + for(var/eventId in pending_events) + pending_events[eventId] = TRUE + return reattach_response if(DMAPI5_TOPIC_COMMAND_SEND_CHUNK) @@ -256,4 +272,25 @@ return chunk_to_send + if(DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST) + var/message = topic_parameters[DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE] + if (!istext(message)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE]") + + TGS_WORLD_ANNOUNCE(message) + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT) + var/event_id = topic_parameters[DMAPI5_EVENT_ID] + if (!istext(event_id)) + return TopicResponse("Invalid or missing [DMAPI5_EVENT_ID]") + + TGS_DEBUG_LOG("Completing event ID [event_id]...") + pending_events[event_id] = TRUE + return TopicResponse() + return TopicResponse("Unknown command: [command]") + +/datum/tgs_api/v5/proc/WorldBroadcast(message) + set waitfor = FALSE + TGS_WORLD_ANNOUNCE(message) diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index e3455b69d1c6..237207fdfd05 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -8,16 +8,17 @@ #undef DMAPI5_TOPIC_REQUEST_LIMIT #undef DMAPI5_TOPIC_RESPONSE_LIMIT -#undef DMAPI5_BRIDGE_COMMAND_PORT_UPDATE #undef DMAPI5_BRIDGE_COMMAND_STARTUP #undef DMAPI5_BRIDGE_COMMAND_PRIME #undef DMAPI5_BRIDGE_COMMAND_REBOOT #undef DMAPI5_BRIDGE_COMMAND_KILL #undef DMAPI5_BRIDGE_COMMAND_CHAT_SEND #undef DMAPI5_BRIDGE_COMMAND_CHUNK +#undef DMAPI5_BRIDGE_COMMAND_EVENT #undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER #undef DMAPI5_PARAMETER_CUSTOM_COMMANDS +#undef DMAPI5_PARAMETER_TOPIC_PORT #undef DMAPI5_CHUNK #undef DMAPI5_CHUNK_PAYLOAD @@ -34,6 +35,7 @@ #undef DMAPI5_BRIDGE_PARAMETER_VERSION #undef DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE #undef DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL +#undef DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION #undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT #undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION @@ -48,6 +50,7 @@ #undef DMAPI5_RUNTIME_INFORMATION_REVISION #undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES #undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL +#undef DMAPI5_RUNTIME_INFORMATION_VISIBILITY #undef DMAPI5_CHAT_UPDATE_CHANNELS @@ -75,8 +78,12 @@ #undef DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED #undef DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE #undef DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE -#undef DMAPI5_TOPIC_COMMAND_HEARTBEAT +#undef DMAPI5_TOPIC_COMMAND_HEALTHCHECK #undef DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH +#undef DMAPI5_TOPIC_COMMAND_SEND_CHUNK +#undef DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK +#undef DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST +#undef DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT #undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE #undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND @@ -86,6 +93,7 @@ #undef DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME #undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE #undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION +#undef DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE @@ -111,3 +119,9 @@ #undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME #undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT #undef DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY + +#undef DMAPI5_EVENT_ID + +#undef DMAPI5_EVENT_INVOCATION_NAME +#undef DMAPI5_EVENT_INVOCATION_PARAMETERS +#undef DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index aef5773594ac..703ec1c735ee 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -116,7 +116,7 @@ * * return UI_state The state of the UI. */ -/mob/living/proc/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE) +/mob/living/proc/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE, allow_tk = TRUE) // If the object is obscured, close it. if(viewcheck && !(src_object in view(src))) return UI_CLOSE @@ -133,7 +133,7 @@ // Otherwise, we got nothing. return UI_CLOSE -/mob/living/carbon/human/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE) - if(dna.check_mutation(TK) && tkMaxRangeCheck(src, src_object)) +/mob/living/carbon/human/shared_living_ui_distance(atom/movable/src_object, viewcheck = TRUE, allow_tk = TRUE) + if(allow_tk && dna.check_mutation(TK) && tkMaxRangeCheck(src, src_object)) return UI_INTERACTIVE return ..() diff --git a/code/modules/tgui/states/pilot.dm b/code/modules/tgui/states/pilot.dm new file mode 100644 index 000000000000..c5b63b5ad1d8 --- /dev/null +++ b/code/modules/tgui/states/pilot.dm @@ -0,0 +1,9 @@ +GLOBAL_DATUM_INIT(pilot_state, /datum/ui_state/pilot_state, new) + +/datum/ui_state/pilot_state/can_use_topic(src_object, mob/user) + if(!ismecha(src_object)) + return UI_CLOSE + var/obj/mecha/gundam = src_object + if(user == gundam.occupant) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/code/modules/tgui/status_composers.dm b/code/modules/tgui/status_composers.dm new file mode 100644 index 000000000000..46eef2b40204 --- /dev/null +++ b/code/modules/tgui/status_composers.dm @@ -0,0 +1,112 @@ +/// The sane defaults for a UI such as a computer or a machine. +/proc/default_ui_state(mob/user, atom/source) + return min( + ui_status_user_is_abled(user, source), + ui_status_user_has_free_hands(user, source), + ui_status_user_is_advanced_tool_user(user), + ui_status_only_living(user), + max( + ui_status_user_is_adjacent(user, source), + ui_status_silicon_has_access(user, source), + ) + ) + +/// Returns a UI status such that users adjacent to source will be able to interact, +/// far away users will be able to see, and anyone farther won't see anything. +/// Dead users will receive updates no matter what, though you likely want to add +/// a [`ui_status_only_living`] check for finer observer interactions. +/proc/ui_status_user_is_adjacent(mob/user, atom/source, allow_tk = TRUE) + if (isliving(user)) + var/mob/living/living_user = user + return living_user.shared_living_ui_distance(source, allow_tk = allow_tk) + else + return UI_UPDATE + +/// Returns a UI status such that the dead will be able to watch, but not interact. +/proc/ui_status_only_living(mob/user, source) + if (isliving(user)) + return UI_INTERACTIVE + + if(isobserver(user)) + // If they turn on ghost AI control, admins can always interact. + if(IsAdminGhost(user)) + return UI_INTERACTIVE + + // Regular ghosts can always at least view if in range. + var/datum/client_interface/client = GET_CLIENT(user) + if(client) + var/clientviewlist = getviewsize(client.view) + if(get_dist(source, user) < max(clientviewlist[1], clientviewlist[2])) + return UI_UPDATE + + return UI_CLOSE + +/// Returns a UI status such that users with debilitating conditions, such as +/// being dead or not having power for silicons, will not be able to interact. +/// Being dead will disable UI, being incapacitated will continue updating it, +/// and anything else will make it interactive. +/proc/ui_status_user_is_abled(mob/user, atom/source) + return user.shared_ui_interaction(source) + +/// Returns a UI status such that those without blocked hands will be able to interact, +/// but everyone else can only watch. +/proc/ui_status_user_has_free_hands(mob/user, atom/source) + return HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) ? UI_UPDATE : UI_INTERACTIVE + +/// Returns a UI status such that advanced tool users will be able to interact, +/// but everyone else can only watch. +/proc/ui_status_user_is_advanced_tool_user(mob/user) + return user.IsAdvancedToolUser() ? UI_INTERACTIVE : UI_UPDATE + +/// Returns a UI status such that silicons will be able to interact with whatever +/// they would have access to if this was a machine. For example, AIs can +/// interact if there's cameras with wireless control is enabled. +/proc/ui_status_silicon_has_access(mob/user, atom/source) + if (!issilicon(user)) + return UI_CLOSE + var/mob/living/silicon/silicon_user = user + return silicon_user.get_ui_access(source) + +/// Returns a UI status representing this silicon's capability to access +/// the given source. Called by `ui_status_silicon_has_access`. +/mob/living/silicon/proc/get_ui_access(atom/source) + return UI_CLOSE + +/mob/living/silicon/robot/get_ui_access(atom/source) + // Robots can interact with anything they can see. + var/list/clientviewlist = getviewsize(client.view) + if(get_dist(src, source) <= min(clientviewlist[1],clientviewlist[2])) + return UI_INTERACTIVE + return UI_DISABLED // Otherwise they can keep the UI open. + +/mob/living/silicon/ai/get_ui_access(atom/source) + // The AI can interact with anything it can see nearby, or with cameras while wireless control is enabled. + if(!control_disabled && can_see(source)) + return UI_INTERACTIVE + return UI_CLOSE + +/mob/living/silicon/pai/get_ui_access(atom/source) + // pAIs can only use themselves and the owner's radio. + if((source == src || source == radio) && !stat) + return UI_INTERACTIVE + else + return UI_CLOSE + +/// Returns UI_INTERACTIVE if the user is conscious and lying down. +/// Returns UI_UPDATE otherwise. +/proc/ui_status_user_is_conscious_and_lying_down(mob/user) + if (!isliving(user)) + return UI_UPDATE + + var/mob/living/living_user = user + return (!(living_user.mobility_flags & MOBILITY_MOVE) && living_user.stat == CONSCIOUS) \ + ? UI_INTERACTIVE \ + : UI_UPDATE + +/// Return UI_INTERACTIVE if the user is strictly adjacent to the target atom, whether they can see it or not. +/// Return UI_CLOSE otherwise. +/proc/ui_status_user_strictly_adjacent(mob/user, atom/target) + if(get_dist(target, user) > 1) + return UI_CLOSE + + return UI_INTERACTIVE diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index ca029b16733c..15eadfe6557e 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -70,12 +70,14 @@ #define TRAIT_SOURCE_UNIT_TESTS "unit_tests" #include "anchored_mobs.dm" +#include "atmos_tests.dm" #include "baseturfs.dm" #include "component_tests.dm" #include "dcs_check_list_arguments.dm" #include "dragon_expiration.dm" #include "dynamic_ruleset_sanity.dm" #include "focus_only_tests.dm" +#include "greyscale_config.dm" #include "map_landmarks.dm" #include "mapping.dm" #include "reagent_id_typos.dm" diff --git a/code/modules/unit_tests/atmos_tests.dm b/code/modules/unit_tests/atmos_tests.dm new file mode 100644 index 000000000000..dea62df4a0ab --- /dev/null +++ b/code/modules/unit_tests/atmos_tests.dm @@ -0,0 +1,12 @@ +/datum/unit_test/fusion_reaction/Run() + var/datum/gas_mixture/fusion_test_mix = new + + fusion_test_mix.set_moles(GAS_TRITIUM, 1000) + fusion_test_mix.set_moles(GAS_PLASMA, 4500) + fusion_test_mix.set_moles(GAS_CO2, 1500) + fusion_test_mix.set_moles(GAS_DILITHIUM, 2000) + fusion_test_mix.set_temperature(FUSION_TEMPERATURE_THRESHOLD - 1) + + if(fusion_test_mix.react() != REACTING) + TEST_FAIL("Fusion reaction was unable to start!") + qdel(fusion_test_mix) diff --git a/code/modules/unit_tests/greyscale_config.dm b/code/modules/unit_tests/greyscale_config.dm new file mode 100644 index 000000000000..4b441a101936 --- /dev/null +++ b/code/modules/unit_tests/greyscale_config.dm @@ -0,0 +1,41 @@ +/// Makes sure items using GAGS have all the icon states needed to work +/datum/unit_test/greyscale_item_icon_states + +/datum/unit_test/greyscale_item_icon_states/Run() + for(var/obj/item/item_path as anything in subtypesof(/obj/item)) + if(isnull(initial(item_path.greyscale_colors))) + continue //All configs depend on greyscale_colors being defined. + var/held_icon_state = initial(item_path.item_state) || initial(item_path.icon_state) + + var/datum/greyscale_config/lefthand = SSgreyscale.configurations["[initial(item_path.greyscale_config_inhand_left)]"] + if(lefthand && !lefthand.icon_states[held_icon_state]) + TEST_FAIL("[lefthand.DebugName()] is missing a sprite for the held lefthand for [item_path]. Expected icon state: '[held_icon_state]'") + + var/datum/greyscale_config/righthand = SSgreyscale.configurations["[initial(item_path.greyscale_config_inhand_right)]"] + if(righthand && !righthand.icon_states[held_icon_state]) + TEST_FAIL("[righthand.DebugName()] is missing a sprite for the held righthand for [item_path]. Expected icon state: '[held_icon_state]'") + + var/datum/greyscale_config/worn = SSgreyscale.configurations["[initial(item_path.greyscale_config_worn)]"] + var/worn_icon_state = initial(item_path.worn_icon_state) || initial(item_path.icon_state) + if(worn && !worn.icon_states[worn_icon_state]) + TEST_FAIL("[worn.DebugName()] is missing a sprite for the worn overlay for [item_path]. Expected icon state: '[worn_icon_state]'") + + var/datum/greyscale_config/belt = SSgreyscale.configurations["[initial(item_path.greyscale_config_belt)]"] + var/belt_icon_state = initial(item_path.belt_icon_state) || initial(item_path.icon_state) + if(belt && !belt.icon_states[belt_icon_state]) + TEST_FAIL("[belt.DebugName()] is missing a sprite for the belt overlay for [item_path]. Expected icon state: '[belt_icon_state]'") + +/// Makes sure objects using greyscale configs have, if any, the correct number of colors +/datum/unit_test/greyscale_color_count + +/datum/unit_test/greyscale_color_count/Run() + for(var/atom/thing as anything in subtypesof(/atom)) + var/datum/greyscale_config/config = SSgreyscale.configurations["[initial(thing.greyscale_config)]"] + if(!config) + continue + var/list/colors = splittext(initial(thing.greyscale_colors), "#") + if(!length(colors)) + continue + var/number_of_colors = length(colors) - 1 + if(config.expected_colors != number_of_colors) + TEST_FAIL("[thing] has the wrong amount of colors configured for [config.DebugName()]. Expected [config.expected_colors] but only found [number_of_colors].") diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 96460e519239..f44e8fc98bde 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -339,6 +339,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) manufacturer = /datum/corporation/traitor/cybersun surplus = 0 +/datum/uplink_item/dangerous/gasharpoon + name = "Gasharpoon" + desc = "A repurposed space-whaling tool attatched to a glove, can be used as a sturdy weapon in both hands, or worn as a glove to allow access to it's harpoon." + item = /obj/item/clothing/gloves/gasharpoon + cost = 10 + surplus = 0 + /datum/uplink_item/dangerous/rawketlawnchair name = "84mm Rocket Propelled Grenade Launcher" desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \ @@ -707,6 +714,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) deflecting all ranged weapon fire when throwmode is enabled, but you also refuse to use dishonorable ranged weaponry." item = /obj/item/book/granter/martial/carp cost = 14 + player_minimum = 20 surplus = 0 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration @@ -1435,6 +1443,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cant_discount = TRUE cost = 105 //Yogs change +/datum/uplink_item/support/mamba + name = "Black Mamba Exosuit" + desc = "A stealthy, quick, and deadly combat exosuit, this modified sidewinder chassis is capable of suddenly striking and retreating while \ + the effects of its venomous weapons take hold. Comes with a venom carbine, dual daggers, and an anti-projectile armor booster." + item = /obj/mecha/combat/sidewinder/mamba/loaded + cant_discount = TRUE + cost = 75 + // Stealth Items /datum/uplink_item/stealthy_tools category = "Stealth Gadgets" diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index 836fcd5035c2..51227b0f60df 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -33,19 +33,6 @@ occupant_actions = list() generate_actions() -/obj/vehicle/examine(mob/user) - . = ..() - if(resistance_flags & ON_FIRE) - . += span_warning("It's on fire!") - var/healthpercent = obj_integrity/max_integrity * 100 - switch(healthpercent) - if(50 to 99) - . += "It looks slightly damaged." - if(25 to 50) - . += "It appears heavily damaged." - if(0 to 25) - . += span_warning("It's falling apart!") - /obj/vehicle/proc/is_key(obj/item/I) return I? (key_type_exact? (I.type == key_type) : istype(I, key_type)) : FALSE diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index a8b685b63fdb..6f25e03b4f1c 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -57,7 +57,7 @@ . = ..() if(istype(I, /obj/item/reagent_containers/food/snacks/grown/banana)) var/obj/item/reagent_containers/food/snacks/grown/banana/banana = I - obj_integrity += min(banana.seed.potency, max_integrity-obj_integrity) + update_integrity(atom_integrity + min(banana.seed.potency, max_integrity-atom_integrity)) to_chat(user, span_danger("You use the [banana] to repair the [src]!")) qdel(banana) diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm index 29337df5d20c..d50b4fda63f6 100644 --- a/code/modules/vehicles/motorized_wheelchair.dm +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -36,7 +36,7 @@ power_cell.update_appearance(UPDATE_ICON) refresh_parts() -/obj/vehicle/ridden/wheelchair/motorized/obj_destruction(damage_flag) +/obj/vehicle/ridden/wheelchair/motorized/atom_destruction(damage_flag, total_destruction=FALSE) drop_contents() . = ..() diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index bea046eb4ca9..009d67722663 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -252,6 +252,8 @@ name = "Wheely-Heels" desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." icon = null + ///Stores the shoes associated with the vehicle + var/obj/item/clothing/shoes/wheelys/shoes = null /obj/vehicle/ridden/scooter/wheelys/Initialize(mapload) . = ..() @@ -266,12 +268,18 @@ if(!has_buckled_mobs()) to_chat(M, span_notice("You pop the Wheely-Heels' wheels back into place.")) moveToNullspace() + shoes.toggle_wheels(FALSE) return ..() /obj/vehicle/ridden/scooter/wheelys/post_buckle_mob(mob/living/M) to_chat(M, span_notice("You pop out the Wheely-Heels' wheels.")) + shoes.toggle_wheels(TRUE) return ..() +///Sets the shoes that the vehicle is associated with, called when the shoes are initialized +/obj/vehicle/ridden/scooter/wheelys/proc/link_shoes(newshoes) + shoes = newshoes + /obj/vehicle/ridden/scooter/wheelys/Bump(atom/A) . = ..() if(A.density && has_buckled_mobs()) @@ -316,7 +324,8 @@ /obj/vehicle/ridden/scooter/airshoes/Destroy() if(sparks) QDEL_NULL(sparks) - . = ..() + return ..() + /obj/vehicle/ridden/scooter/airshoes/relaymove() if (grinding || world.time < next_crash) return FALSE diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 0309789cc224..cf3f2d9284b9 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -17,15 +17,15 @@ if(user.a_intent == INTENT_HARM) return FALSE - if(obj_integrity == max_integrity) + if(atom_integrity == max_integrity) to_chat(user, span_warning("[src] is already in good condition!")) return FALSE to_chat(user, span_notice("You begin repairing [src]...")) if(I.use_tool(src, user, 10, volume=50)) to_chat(user, span_notice("You repair [src].")) - obj_integrity = min(max_integrity, obj_integrity + 20) - if(obj_integrity == max_integrity) + update_integrity(min(max_integrity, atom_integrity + 20)) + if(atom_integrity == max_integrity) to_chat(user, span_notice("[src] looks to be fully repaired now.")) return TRUE diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 4ae64a963983..3faa7e853b80 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -22,10 +22,10 @@ D.set_vehicle_dir_layer(WEST, OBJ_LAYER) AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, PROC_REF(can_user_rotate)),CALLBACK(src, PROC_REF(can_be_rotated)),null) -/obj/vehicle/ridden/wheelchair/obj_destruction(damage_flag) +/obj/vehicle/ridden/wheelchair/atom_destruction(damage_flag) new /obj/item/stack/rods(drop_location(), 1) new /obj/item/stack/sheet/metal(drop_location(), 1) - ..() + return ..() /obj/vehicle/ridden/wheelchair/Destroy() if(has_buckled_mobs()) @@ -171,7 +171,7 @@ . = ..() initialize_controller_action_type(/datum/action/vehicle/ridden/wheelchair/explosive/kaboom, VEHICLE_CONTROL_DRIVE) -/obj/vehicle/ridden/wheelchair/explosive/obj_destruction(damage_flag) +/obj/vehicle/ridden/wheelchair/explosive/atom_destruction(damage_flag) explosion(src, 1, 3, 5) qdel(src) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index d24140621bcc..c7aeff5c7b11 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -303,7 +303,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C if(light_mask && !(stat & BROKEN) && powered()) . += emissive_appearance(icon, light_mask, src) -/obj/machinery/vending/obj_break(damage_flag) +/obj/machinery/vending/atom_break(damage_flag) . = ..() if(!.) return diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index b55dd8715d32..c7dd2a957a23 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -43,6 +43,7 @@ /obj/item/clothing/neck/tie/red = 3, /obj/item/clothing/neck/tie/black = 3, /obj/item/clothing/neck/tie/horrible = 3, + /obj/item/clothing/accessory/pride = 15, /obj/item/storage/belt/fannypack = 3, /obj/item/storage/belt/fannypack/blue = 3, /obj/item/storage/belt/fannypack/red = 3, diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index adfcc0a5e178..150a758261dc 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -1,6 +1,7 @@ /obj/machinery/vending/wallmed name = "\improper NanoMed" desc = "Wall-mounted Medical Equipment dispenser." + icon = 'yogstation/icons/obj/vending.dmi' icon_state = "wallmed" icon_deny = "wallmed-deny" density = FALSE @@ -19,7 +20,7 @@ extra_price = 100 payment_department = ACCOUNT_MED tiltable = FALSE - light_mask = "wallmed-light-mask" + light_mask = "wall-light-mask" /obj/item/vending_refill/wallmed machine_name = "NanoMed" diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 7e7b36b53812..ada6634c49e7 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -18,6 +18,7 @@ /obj/item/seeds/chili = 3, /obj/item/seeds/cinnamomum = 3, /obj/item/seeds/cocoapod = 3, + /obj/item/seeds/coconut = 3, /obj/item/seeds/coffee = 3, /obj/item/seeds/corn = 3, /obj/item/seeds/cotton = 3, diff --git a/code/modules/vending/modularpc.dm b/code/modules/vending/modularpc.dm index dd2c012d4cb8..9937454bbc3f 100644 --- a/code/modules/vending/modularpc.dm +++ b/code/modules/vending/modularpc.dm @@ -24,7 +24,8 @@ /obj/item/computer_hardware/card_slot/secondary = 2, /obj/item/computer_hardware/ai_slot = 2, /obj/item/computer_hardware/printer/mini = 2, - /obj/item/computer_hardware/recharger/APC = 2) + /obj/item/computer_hardware/recharger/APC = 2, + /obj/item/computer_hardware/ai_interface = 2) refill_canister = /obj/item/vending_refill/modularpc default_price = 30 extra_price = 250 diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 32519753a6ae..ed695971e3e4 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -43,3 +43,32 @@ /obj/item/vending_refill/donksoft machine_name = "Donksoft Toy Vendor" icon_state = "refill_donksoft" + +/obj/machinery/vending/donksofttoyvendor/hugbox + name = "\improper Hugsoft Toy Vendor" + desc = "An ages 8 and up approved vendor that dispenses toys. This one feels noticably less fun..." + circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor/hugbox + products = list( + /obj/item/gun/ballistic/automatic/toy/unrestricted/hugbox = 10, + /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted/hugbox = 10, + /obj/item/gun/ballistic/shotgun/toy/unrestricted/hugbox = 10, + /obj/item/toy/sword = 10, + /obj/item/melee/vxtvulhammer/toy = 7, + /obj/item/ammo_box/foambox = 30, + /obj/item/toy/foamblade = 10, + /obj/item/toy/foamblade/baseball = 10, + /obj/item/toy/syndicateballoon = 10, + /obj/item/clothing/suit/syndicatefake = 5, + /obj/item/clothing/head/syndicatefake = 5, + /obj/item/gun/magic/sickly_blade_toy = 1, + /obj/item/gun/magic/sickly_blade_toy/rust_toy = 1, + /obj/item/gun/magic/sickly_blade_toy/ash_toy = 1, + /obj/item/gun/magic/sickly_blade_toy/flesh_toy =1, + /obj/item/gun/ballistic/shotgun/toy/crossbow/hugbox = 10, // No more contraband section because they cant load riot darts anymore. + /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/hugbox = 10, + /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/hugbox = 10, + /obj/item/gun/water/full = 10, + /obj/item/toy/katana = 10, + /obj/item/melee/dualsaber/toy = 5, + /obj/item/organ/cyberimp/chest/spinalspeed/toy = 5 + ) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 37098892965c..4c8d65b165c8 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -58,7 +58,9 @@ /obj/item/clothing/head/helmet/secconhelm = 3, /obj/item/clothing/suit/armor/secconcoat = 3, /obj/item/clothing/head/beret/sec/secconhat = 3, - /obj/item/clothing/suit/armor/secconvest = 3) + /obj/item/clothing/suit/armor/secconvest = 3, + /obj/item/clothing/under/plasmaman/security = 3, + /obj/item/clothing/head/helmet/space/plasmaman/security = 3) premium = list(/obj/item/clothing/under/rank/security/navyblue = 3, /obj/item/clothing/suit/armor/officerjacket = 3, /obj/item/clothing/head/beret/sec/navyofficer = 3) @@ -368,7 +370,6 @@ /obj/item/clothing/under/yogs/casualjanitorsuit = 2, /obj/item/clothing/suit/yogs/janitorcoat = 2, /obj/item/clothing/suit/hooded/wintercoat/janitor = 2, - /obj/item/cartridge/janitor = 2, /obj/item/clothing/under/rank/janitor/skirt = 2, /obj/item/clothing/under/janimaid = 2, /obj/item/clothing/gloves/color/black = 2, diff --git a/config/admins.txt b/config/admins.txt index e53c2ea948a8..e03a6aa4268f 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -8,11 +8,11 @@ # and will override any duplicate entries in the database. # ############################################################################################### -AshCorr = Host +spl99 = Host Xantam = Host aquizit = Council Member -mordrehel = Council Member +hisakaki = Council Member cowbot93 = Council Member jamied12 = Head Developer diff --git a/config/config.txt b/config/config.txt index e077fe2da1f1..e3e17849b3e1 100644 --- a/config/config.txt +++ b/config/config.txt @@ -422,6 +422,16 @@ DEFAULT_VIEW 19x15 ## You probably shouldn't ever be changing this, but it's here if you want to. DEFAULT_VIEW_SQUARE 15x15 + +## Enable automatic profiling - Byond 513.1506 and newer only. +#AUTO_PROFILE + +## Threshold (in deciseconds) for real time between ticks before we start dumping profiles +DRIFT_DUMP_THRESHOLD 40 + +## How long to wait (in deciseconds) after a profile dump before logging another tickdrift sourced one +DRIFT_PROFILE_DELAY 150 + ## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. ## You need to set up your database to use the SQL based system. ## This flag is automatically enabled if SQL_ENABLED isn't diff --git a/config/dbconfig.txt b/config/dbconfig.txt index 4e1c5edc1e07..42c37282d967 100644 --- a/config/dbconfig.txt +++ b/config/dbconfig.txt @@ -12,7 +12,7 @@ ASYNC_QUERY_TIMEOUT 10 BLOCKING_QUERY_TIMEOUT 5 ## The maximum number of additional threads BSQL is allowed to run at once -BSQL_THREAD_LIMIT 50 +POOLING_MAX_SQL_CONNECTIONS 50 ## Uncomment to enable verbose BSQL communication logs #BSQL_DEBUG diff --git a/config/game_options.txt b/config/game_options.txt index 9dd863aded73..1b5cbf0dd834 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -54,7 +54,7 @@ WALK_DELAY 6 ## Entries completely override all subtypes. Later entries have precedence over earlier entries. ## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and ## /mob/living/carbon/human on the last entry, the last entry will override the first. -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0.1 ##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0 MULTIPLICATIVE_MOVESPEED /mob/living/carbon/monkey 0 ##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0 @@ -674,11 +674,8 @@ MICE_ROUNDSTART 5 ## This used to be named traits, hence the config name, but it handles quirks, not the other kind of trait! ROUNDSTART_TRAITS -## Uncomment to disable human moods. -DISABLE_HUMAN_MOOD - -## Uncomment to force human moods. Not compatible with DISABLE_HUMAN_MOOD -FORCE_HUMAN_MOOD +## Uncomment to allow selection for human moods. Comment to force moods on +#DISABLE_HUMAN_MOOD ## Enable night shifts ## #ENABLE_NIGHT_SHIFTS diff --git a/config/minor_filter.txt b/config/minor_filter.txt index aa85b4b3076f..ac7413206708 100644 --- a/config/minor_filter.txt +++ b/config/minor_filter.txt @@ -46,7 +46,7 @@ pls=please plz=please \btf\b=the fuck \bi\b=I -auxmos=space wind -aux mos=space wind +auxmos=La Li Lu Le Lo +aux mos=La Li Lu Le Lo \bnp\b=no problem \bthx\b=thanks diff --git a/config/private_default.txt b/config/private_default.txt index 88850ee7cada..832186c7c650 100644 --- a/config/private_default.txt +++ b/config/private_default.txt @@ -86,9 +86,8 @@ VOICE_ANNOUNCE_DIR ../Yogstation.net/voice_announce_tmp ## Enable the demo subsystem #DEMOS_ENABLED -## Starlight for exterior walls and breaches. Uncomment for starlight! -## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting -#STARLIGHT +## Enable automatic profiling - Byond 513.1506 and newer only. +#AUTO_PROFILE ## Assets can opt-in to caching their results into `tmp`. diff --git a/config/private_server.txt b/config/private_server.txt index 8b2019e124ee..f8d2ee73d29d 100644 --- a/config/private_server.txt +++ b/config/private_server.txt @@ -97,6 +97,9 @@ VOICE_ANNOUNCE_DIR data/voice_announcements ## Enable the demo subsystem DEMOS_ENABLED +## Enable automatic profiling - Byond 513.1506 and newer only. +AUTO_PROFILE + ## Starlight for exterior walls and breaches. Uncomment for starlight! ## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting STARLIGHT diff --git a/config/title_screens/images/joke/Am37000.gif b/config/title_screens/images/joke/Am37000.gif new file mode 100644 index 000000000000..692f6d005e43 Binary files /dev/null and b/config/title_screens/images/joke/Am37000.gif differ diff --git a/config/title_screens/images/joke/lazenn.png b/config/title_screens/images/joke/lazenn.png new file mode 100644 index 000000000000..0b8b1c630307 Binary files /dev/null and b/config/title_screens/images/joke/lazenn.png differ diff --git a/config/title_screens/images/joke/narwhalstar13.png b/config/title_screens/images/joke/narwhalstar13.png new file mode 100644 index 000000000000..379dde335ef2 Binary files /dev/null and b/config/title_screens/images/joke/narwhalstar13.png differ diff --git a/config/title_screens/images/joke/thatguyphil.png b/config/title_screens/images/joke/thatguyphil.png new file mode 100644 index 000000000000..2348795a7776 Binary files /dev/null and b/config/title_screens/images/joke/thatguyphil.png differ diff --git a/config/title_screens/images/joke/willymount00.png b/config/title_screens/images/joke/willymount00.png new file mode 100644 index 000000000000..6b816734aa6e Binary files /dev/null and b/config/title_screens/images/joke/willymount00.png differ diff --git a/config/title_screens/images/normal/boba.gif b/config/title_screens/images/normal/boba.gif new file mode 100644 index 000000000000..09b1f0d45216 Binary files /dev/null and b/config/title_screens/images/normal/boba.gif differ diff --git a/config/title_screens/images/normal/flikr.png b/config/title_screens/images/normal/flikr.png new file mode 100644 index 000000000000..7d65a7a5f0e2 Binary files /dev/null and b/config/title_screens/images/normal/flikr.png differ diff --git a/config/title_screens/images/normal/monster.gif b/config/title_screens/images/normal/monster.gif new file mode 100644 index 000000000000..7c0dc3a5be70 Binary files /dev/null and b/config/title_screens/images/normal/monster.gif differ diff --git a/config/title_screens/images/normal/tessa.gif b/config/title_screens/images/normal/tessa.gif new file mode 100644 index 000000000000..84b6d2957a6f Binary files /dev/null and b/config/title_screens/images/normal/tessa.gif differ diff --git a/config/title_screens/images/yogstation.png b/config/title_screens/images/normal/yogstation.png similarity index 100% rename from config/title_screens/images/yogstation.png rename to config/title_screens/images/normal/yogstation.png diff --git a/config/title_screens/images/rare/azzzertyy.png b/config/title_screens/images/rare/azzzertyy.png new file mode 100644 index 000000000000..5d0fdb339527 Binary files /dev/null and b/config/title_screens/images/rare/azzzertyy.png differ diff --git a/config/title_screens/images/rare+fire.png b/config/title_screens/images/rare/fire.png similarity index 100% rename from config/title_screens/images/rare+fire.png rename to config/title_screens/images/rare/fire.png diff --git a/config/title_screens/images/rare/m4565.png b/config/title_screens/images/rare/m4565.png new file mode 100644 index 000000000000..d5bf1b9b6cb9 Binary files /dev/null and b/config/title_screens/images/rare/m4565.png differ diff --git a/config/title_screens/images/rare+yogurt.png b/config/title_screens/images/rare/yogurt.png similarity index 100% rename from config/title_screens/images/rare+yogurt.png rename to config/title_screens/images/rare/yogurt.png diff --git a/html/changelog.css b/html/changelog.css index 2bfa3fa49558..a59d295f4872 100644 --- a/html/changelog.css +++ b/html/changelog.css @@ -1,41 +1,42 @@ -.top{font-family:Tahoma,sans-serif;font-size:12px;} -h2{font-family:Tahoma,sans-serif;} -a img {border:none;} -.bgimages16 li { - padding:2px 10px 2px 30px; - background-position:6px center; - background-repeat:no-repeat; - border:1px solid #ddd; - border-left:4px solid #999; - margin-bottom:2px; -} -.bugfix {background-image:url(bug-minus.png)} -.wip {background-image:url(hard-hat-exclamation.png)} -.tweak {background-image:url(wrench-screwdriver.png)} -.soundadd {background-image:url(music-plus.png)} -.sounddel {background-image:url(music-minus.png)} -.rscdel {background-image:url(cross-circle.png)} -.rscadd {background-image:url(tick-circle.png)} -.imageadd {background-image:url(image-plus.png)} -.imagedel {background-image:url(image-minus.png)} -.spellcheck {background-image:url(spell-check.png)} -.experiment {background-image:url(burn-exclamation.png)} -.refactor {background-image:url(burn-exclamation.png)} -.code_imp {background-image:url(coding.png)} -.config {background-image:url(chrome-wrench.png)} -.admin {background-image:url(ban.png)} -.server {background-image:url(hard-hat-exclamation.png)} -.balance {background-image:url(scales.png)} -.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} -.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} -.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} -.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} -.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} -.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} -.hidden {display:none;} -.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} -.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} -.indrop img {margin-right:5px;vertical-align:middle;} -.closed {background:url(chevron-expand.png) right center no-repeat;} -.open {background:url(chevron.png) right center no-repeat;} -.lic {font-size:9px;} +.top{font-family:Tahoma,sans-serif;font-size:12px;} +h2{font-family:Tahoma,sans-serif;} +a img {border:none;} +.bgimages16 li { + padding:2px 10px 2px 30px; + background-position:6px center; + background-repeat:no-repeat; + border:1px solid #ddd; + border-left:4px solid #999; + margin-bottom:2px; +} +.bugfix {background-image:url(bug-minus.png)} +.wip {background-image:url(hard-hat-exclamation.png)} +.tweak {background-image:url(wrench-screwdriver.png)} +.soundadd {background-image:url(music-plus.png)} +.sounddel {background-image:url(music-minus.png)} +.rscdel {background-image:url(cross-circle.png)} +.rscadd {background-image:url(tick-circle.png)} +.imageadd {background-image:url(image-plus.png)} +.imagedel {background-image:url(image-minus.png)} +.mapping {background-image:url(mapping.png)} +.spellcheck {background-image:url(spell-check.png)} +.experiment {background-image:url(burn-exclamation.png)} +.refactor {background-image:url(burn-exclamation.png)} +.code_imp {background-image:url(coding.png)} +.config {background-image:url(chrome-wrench.png)} +.admin {background-image:url(ban.png)} +.server {background-image:url(hard-hat-exclamation.png)} +.balance {background-image:url(scales.png)} +.sansserif {font-family:Tahoma,sans-serif;font-size:12px;} +.commit {margin-bottom:20px;font-size:100%;font-weight:normal;} +.changes {list-style:none;margin:5px 0;padding:0 0 0 25px;font-size:0.8em;} +.date {margin:10px 0;color:blue;border-bottom:2px solid #00f;width:60%;padding:2px 0;font-size:1em;font-weight:bold;} +.author {padding-left:10px;margin:0;font-weight:bold;font-size:0.9em;} +.drop {cursor:pointer;border:1px solid #999;display:inline;font-size:0.9em;padding:1px 20px 1px 5px;line-height:16px;} +.hidden {display:none;} +.indrop {margin:2px 0 0 0;clear:both;background:#fff;border:1px solid #ddd;padding:5px 10px;} +.indrop p {margin:0;font-size:0.8em;line-height:16px;margin:1px 0;} +.indrop img {margin-right:5px;vertical-align:middle;} +.closed {background:url(chevron-expand.png) right center no-repeat;} +.open {background:url(chevron.png) right center no-repeat;} +.lic {font-size:9px;} diff --git a/html/changelog.html b/html/changelog.html index 1b0723494808..d7a0a41882b9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,1294 +57,1385 @@ -->
-

18 February 2024

-

Chubbygummibear, cowbot92, JohnFulpWillard, ToasterBiome, LazennG, Moltijoe, LemonInTheDark, azzzertyy updated:

+

27 March 2024

+

AMyriad updated:

    -
  • Rendering backend is like 200% different
  • -
  • stuff glows in the dark
  • -
  • Overlay smoothing is dead
  • -
  • Cameras and other popup maps work on clients >1615
  • -
  • mapmerge tool shouldn't blow up multi-z maps anymore
  • -
  • Yes
  • -
  • icemeta got flipped but it should be the same from top to bottom
  • -
  • yeah
  • +
  • Fixed an issue where prisoners/warden couldn't access the top fridge in perma on Asteroid
  • +
  • Fixed two misplaced firelocks in Box service maintenance

Moltijoe updated:

    -
  • Adds stuff for Hisa to bus with
  • -
  • Sound for bussing stuff
  • -
  • Images for bussing stuff
  • +
  • Fixes a bug where the break machinery objective wouldn't complete until deleted objects went through garbage collection
-

ToasterBiome updated:

+

redmoogle updated:

    -
  • Removes arrival shuttle from NVS Gax, people spawn in cryo now
  • +
  • Mice cheese powers last more than 1 nanosecond
  • +
  • Filing cabinets can accept tape now
  • +
  • Chasms no longer cause wounds
-

cowbot92 updated:

+ +

25 March 2024

+

Moltijoe updated:

    -
  • Removed Yellow Jacket Matriarchs from the gold slime pool
  • +
  • Traitor Vampire gamemode can now roll during lowpop
  • +
  • Traitor Vampire now spawns less traitors to make up for the vampires it spawns
  • +
  • Fixes a typo in coffepack code that made them function like regular boxes
- -

17 February 2024

-

cark updated:

+

redmoogle updated:

    -
  • Added a new lobby song for Valentine's Day "Be My Valentine" by Tim McMorris
  • +
  • Mice have darkvision again
  • +
  • Lipid extractor can no longer extract robots
  • +
  • Smart mines work again
  • +
  • Hilberts hotel works again
  • +
  • Mapping Icon!
  • +
  • Shocked vending machines no longer spark when you walk away
  • +
  • You can no longer take RDS as a robotic species
+ +

24 March 2024

Moltijoe updated:

    -
  • TRAIT_HARDLY_WOUNDED now actually does what it says
  • +
  • Fixes laptop screen overlays appearing while the laptop is closed
  • +
  • adds a 20 pop req to sleeping carp (doesn't require readied up like gamemodes do)
-

Mqiib updated:

+

SapphicOverload updated:

    -
  • Mechs without any power are no longer immune to EMPs
  • +
  • some weapons can now swing in an arc when using harm intent
-

ToasterBiome updated:

+

tattax updated:

    -
  • Traitor AIs can no longer edit their laws.
  • -
  • Paladin now has the correct laws again.
  • +
  • fixed canisters not laying on their side and showing the correct side when broken
  • +
  • fixed error on toolbelt sprite
-

cowbot92 updated:

+ +

23 March 2024

+

AMyriad updated:

    -
  • Adds new donut recipie
  • +
  • Fixed PDA screens being one pixel more to the left than they should be
  • +
  • Fixed water cookies tasting like /datum/reagent/water and metallic cookies tasting like /datum/reagent/copper
  • +
  • Fixed cherry bulbs disappearing when ready to harvest
-

redmoogle updated:

+

ToasterBiome updated:

    -
  • Plasma shotgun can no longer steal your stuff
  • +
  • Cargo shuttle call displays the correct time
  • +
  • sound now travels through z levels if they are onnected
  • +
  • quirks should finally stop resetting for real, along with your jobs since your character is loaded properly.
-

16 February 2024

-

Mqiib updated:

+

22 March 2024

+

AMyriad updated:

    -
  • Tweaked female neck pixel to make clothes look better on non-humans
  • +
  • Fixed a lot of engineering doors having incorrect access requirements
  • +
  • Curators may now only go as far as where the protolathe is in engineering
  • +
  • The Tar King's arena has been completely redesigned! Go check it out
  • +
+

Cartlord updated:

+
    +
  • The Service Hall now has its own access type, which Heads of personnel can add or remove as they see fit.
  • +
  • Artists now have Service Hall access.
  • +
  • Hydroponics on IceMeta can no longer be accessed by Chefs without skeleton crew being active.
-

15 February 2024

-

@Chubbygummibear @LazennG updated:

+

21 March 2024

+

tattax updated:

    -
  • Added new martial art for seismic arm
  • -
  • Removed old seismic arm actions
  • +
  • fixed missing sprite on booth circuitboard
  • +
  • reduced saturation on med and engie circuitobards
  • +
  • fixed wirecutter blood sprites
  • +
  • fixed some messed up screwdriver and wirecutter sprites
-

ktlwjec updated:

+ +

20 March 2024

+

AMyriad updated:

    -
  • Ice cream vat tells you that vanilla ice cream needs vanilla powder to make.
  • -
  • Grape snowcone recipe changed from 5u berry juice to 5u grape juice.
  • +
  • Fixed meatspike frames not checking if they're anchored or not when finishing
  • +
  • Fixed bamboo walls and floors looking like a black void
  • +
  • Fixed the pirate data siphon going invisible when activated
  • +
  • Fixed nuke op's telecomms machine being invisible
  • +
  • Fixed two xeno spawn locations being in public areas

Aquizit updated:

    -
  • No longer told to ahelp when cryoing as a valentine
  • +
  • Gave armory cameras on box and gax c_tags
-

Moltijoe updated:

+ +

19 March 2024

+

cark updated:

    -
  • New wizard spell, bestow appendicitis
  • -
  • Bad wizard that previously had curse of cluwne (before it was removed) now gets appendicitis
  • +
  • fixes some issues on donut
-

Runian updated:

+ +

18 March 2024

+

AMyriad updated:

    -
  • Newly created cyborgs with an closed AI Connection Port do not inherit an AI's laws (if any) before getting desynced.
  • +
  • Fixed invincible carpets looking like a black void (see goat king's arena)
  • +
  • Fixed cog grilles looking like smiling tables
  • +
  • Fixed cargo shuttle blast doors not opening properly
  • +
  • Fixed regenerative cerulean's second extract getting a null description
-

SapphicOverload updated:

+

Aquizit updated:

    -
  • radial menus show up when you're inside an object
  • +
  • Adjusts and adds vents and scrubbers in Atmos Pumping Room
-

redmoogle updated:

+

Chubbygummibear updated:

    -
  • Shitcurity jumpsuit shows up
  • -
  • Light switches are no longer a free source of frames
  • -
  • Fixed RLS description
  • -
  • Teleport + Jump to Area have been merged together
  • -
  • new PS upgrade: doubles the capacity
  • +
  • Ai-detecting multi-tool cannot show you blind spots anymore due to the rendering rework. Rip to a real one
  • +
  • Ai cam location is visible to ghosts again and other entities that should be able to see it
-

tattax updated:

+

Yarinoi updated:

    -
  • fixed spells statpanel not working
  • -
  • fixed golden violin devil spell (lol)
  • +
  • hulk no longer screams over radio
-

thorium90cent updated:

+

enkidienne updated:

    -
  • rain on brick from katana zero is now apart of the jukebox
  • +
  • added lava fishing.
- -

13 February 2024

-

ktlwjec updated:

+

tattax updated:

    -
  • Removes stray pixels from a couple of medikits.
  • +
  • prison jumpsuit shows up again
-

warface1234455 updated:

+ +

17 March 2024

+

Chubbygummibear updated:

    -
  • Give HFR gas monitoring bar a decreasement/increasement rate rate
  • -
  • Moderator now list all sticky gases
  • -
  • increase HFR effciency due to recent process change that decreased HFR performance
  • -
  • dirty production rate no longer relies on fuel injection rate and instead fully rely on the amount of byproduct gas in the reaction
  • +
  • casino slot machines visible again
  • +
  • You can "Bash" on windows by harm intent clicking them with an open hand for a louder audio queue.
  • +
  • Paperframe window sprites were invisible
  • +
  • glassbash.ogg from TG
- -

12 February 2024

Moltijoe updated:

    -
  • Makes a small minor mini tweak to some battle royale weapon weights
  • +
  • Maybe fixes a bug with disposal pipes qdeleting people
-

wonderinghost updated:

+

warface1234455 updated:

    -
  • fixes holoparasites ability to break cuffs
  • -
  • swarmer cuffs take 20 seconds instead of 45
  • -
  • converts cuff deci seconds to seconds
  • -
  • added sprite to alien cuffs
  • +
  • fix decal being transparent when applied with decal painter
-

11 February 2024

-

AMyriad, Wallem, Vincent938, The-Moon-Itself updated:

+

16 March 2024

+

cark updated:

    -
  • You can now construct, deconstruct, and print mass drivers
  • -
  • You can also hack mass drivers now
  • -
  • Mass driver base power reduced from 50 to 10, can be upgraded or hacked to increase it
  • -
  • Mass drivers also have sound effects now!
  • -
  • Updated the mass driver sprite(s)
  • +
  • fixes a couple mapping errors on box

AMyriad updated:

    -
  • Standardized all mentions of the Clockwork "Justicar" into "Justiciar"
  • +
  • Fixed NanoMed using the wrong sprite
  • +
  • Deleted TG's ChemVend and NanoMed sprites after being left over from another PR
-

Loiosh42 updated:

+

Moltijoe updated:

    -
  • Adds an Anti-megafauna ERT, mk2
  • +
  • Tweak mining medic jackets to have comparable armour to an unupgraded explorer suit
  • +
  • Fixes a bug where maroon organ objective wouldn't mulligan properly
  • +
  • fixes mining medic jumpsuit from having 5 less wound armour than every other basic jumpsuit
  • +
  • brig phys now spawns with the brig phys jumpsuit rather than the mining medic one
  • +
  • gives mining medic jumpsuit the same armour as miner's jumpsuit
  • +
  • Gives a 30% chance for traitors to get another objective instead of being told to escape
  • +
  • Fixes a couple issues with hawaiian stuff
  • +
  • Reworks the cursed ice hiking boots
  • +
  • Tweaks mood to have significantly less negatives and REALLY minor positives
  • +
  • This is experimental
  • +
  • Fixes a bug with the dryad crusher trophy
-

MajManatee updated:

+

N3D6 updated:

    -
  • Holopads stop recording/playback when wrenched
  • +
  • adds a missing decal to icemeta
-

Moltijoe updated:

+

ToasterBiome updated:

    -
  • Confusion modified to not scale up to completely randomized movement
  • +
  • Adds a new NVS Gax poster
-

Mqiib updated:

+

cark updated:

    -
  • Flying fang inaccuracy debuff now actually goes away fully instead of stacking infinitely
  • -
  • Leaping with air shoes makes you fall over
  • -
  • Blocking the flying fang leap helps significantly but won't totally save you
  • -
  • Disarm chain defaults to basic harm intent attacks when prone
  • -
  • Mechs don't deflect ion bolts any more
  • +
  • adds colton statue to the CC testing chamber
-

Runian updated:

+

tattax updated:

    -
  • Silicon Law Manager has been added.
  • -
  • Antag AIs can modify their laws with exceptions. They cannot remove their zeroth law (or their devil laws).
  • -
  • "State Laws" has been replaced/moved to the Law Manager.
  • -
  • "Set Auto Announce Mode" has been replaced/moved to Law Manager.
  • -
  • You can no longer view a law module's laws by using it in hand and has been replaced with examining.
  • -
  • The unused and unobtainable "malfunction" lawset was removed.
  • -
  • Examining a law module has been improved and also reveals the laws on it if you are near it or are an observer. Now with formatting!
  • -
  • Silicons now have an easier time setting their auto announcement to Holopad and Binary.
  • -
  • Trying to upload an another law that has the same exact text as a previous law in the same category simply doesn't upload it as panic/spam prevention.
  • -
  • Core preset lawset boards ignores the law cap limit and should no longer causes accidental purges of all inherent laws for AIs.
  • -
  • Changing a pAI's laws is now logged in their history.
  • -
  • RoboTact's law section displays laws without any formatting that comes from things like ion/hacked laws.
  • +
  • admins can change colors on a specific item if it uses the GAGS system
  • +
  • you can now use right click -> toggle flashlight to toggle PDA flashlight
  • +
  • changed some sprites to use GAGS
-

bruhlookatthisdood updated:

+ +

15 March 2024

+

SapphicOverload updated:

    -
  • donut station's tachyon-doppler array is facing the right way now.
  • +
  • fixed chasms killing you if there's an available z-level below
-

cowbot92 updated:

+

ToasterBiome updated:

    -
  • Removes the donksoft vendor from asteroid
  • +
  • job occupations won't delete themselves and you won't be put into random jobs if you haven't loaded your character
  • +
  • mining points card says the correct description
  • +
  • scars check for the correct body part flag instead of the body part itself
-

wonderinghost updated:

+

cowbot92 updated:

    -
  • max tabs in microprocessors have been reduced by one
  • -
  • telescreens can now download camera software
  • -
  • construction bag can now hold computer parts
  • -
  • wired network card has added one bulk to advanced network card
  • -
  • pdas and phones can accept small computer parts
  • -
  • adds box and meta TEG to engine rotation.
  • +
  • adjusts the minor filter
-

10 February 2024

-

Identification & Molti updated:

+

14 March 2024

+

Chubbygummibear updated:

    -
  • Adds a new preternis body colour
  • -
  • adds new preternis eye option
  • -
  • adds new preternis wings
  • +
  • simple mobs call update_appearance on death which will update overlays applied to them
-

Aquizit updated:

+

Moltijoe updated:

    -
  • Laying pipe
  • +
  • Makes the night vision quirk work again
  • +
  • Joe the goliath no longer resists being pulled
-

Runian updated:

+

N3D6 updated:

    -
  • Decreases the unintended burn damage reduction from 2 to 1 for preternis limbs.
  • -
  • The genetics power, Shock Touch, causes confusion down from 15 seconds to 3 seconds. Can be reduced/increased based on targeted electric armor.
  • +
  • tweaks meta engine weights to 45/30/25 sm, reactor, teg
  • +
+

SapphicOverload updated:

+
    +
  • Crew monitoring and tracking works in multi-z
  • +
  • Radio messages work across connected z-levels
  • +
+

YashinHak updated:

+
    +
  • moar pins mostly meme ones but also the gay one
  • +
  • pins are now smaller
  • +
  • new pin icons (obj + mob)
  • +
  • old pin obj icons
-

09 February 2024

-

Mqiib, @Ebin-Halcyon updated:

+

13 March 2024

+

AMyriad updated:

    -
  • Added new turtlenecks for cargo, CMO, and HoP!
  • +
  • CentCom inspectors and clown ops now have their own PDA presets
  • +
  • CentCom inspectors, contractor supports, chameleon kits, etc. no longer spawn with old PDAs - now have modern ones
  • +
  • Changed nukie PDA flavor text
  • +
  • Button frames now have a proper sprite
-

ToasterBiome updated:

+

Moltijoe updated:

    -
  • hermes boots no lonnger create runtimes when walking
  • +
  • Reduces the chance for rare and joke title screens
-

cowbot92 updated:

+

N3D6 updated:

    -
  • Tweaks changeling abilities
  • +
  • rcd ore silo upgrade research price 2500 from 25000
- -

08 February 2024

-

Identification, Molti, lore team (rip skrem) updated:

+

ToasterBiome updated:

    -
  • new preternis sprites
  • -
  • old preternis sprites
  • +
  • jaunters activate automatically in non-belt slots again
  • +
  • bad mail wont stop shuttle anymore
-

06 February 2024

-

Cowbot92 & Chubbygummibear & Mqiib updated:

+

12 March 2024

+

Am37000 & Molti updated:

    -
  • adjusts how emagged minesweeper rewards/works
  • -
  • adjusts the sound of syndicate mines
  • +
  • Added new hawaiian themed items
  • +
  • addedsprites for hawaiian themed items
-

Moltijoe updated:

+

ktlwjec updated:

    -
  • Battle Royale
  • +
  • The pin for the pocket fire extinguisher in-hand sprites are correct.
-

warface1234455 updated:

+

AMyriad updated:

    -
  • Airalarm draught mode now set scrubber range from normal to expanded
  • +
  • Fixed being able to enter centcom via disposals
  • +
  • Skin twister health reduced from 320 -> 285
- -

05 February 2024

-

AMyriad updated:

+

Chubbygummibear updated:

    -
  • Chemist ID card no longer looks like the prisoner ID card
  • +
  • Box Chapel tiles had no plating under them so crow barring them would send you straight to god
  • +
  • Broken grille sprites back. They just wanted to grille for Pete's sake
  • +
  • Organized the spaghetti layering of atmos pipes, disposal pipes, and cables.
-

SapphicOverload updated:

+

Mqiib updated:

    -
  • reactions happening in tanks now know they're reacting inside a tank
  • -
  • buckling to operating tables no longer requires cuffs
  • +
  • Lizards, polysmorphs, and skeletons now actually make claw noises like everyone always said they did. This also indirectly makes them louder.
  • +
+

cowbot92 updated:

+
    +
  • Added Sec Plasmaman stuff to the SecDrobe
-

04 February 2024

-

AMyriad updated:

+

11 March 2024

+

LoliconSlayer updated:

    -
  • Corporate Agents are now gone. Don't know what they are? Exactly nobody does, they won't be missed
  • +
  • tweaked the elder atmosian statue's description
-

Therandomhoboo updated:

+ +

10 March 2024

+

N3D6 updated:

    -
  • Cluwne Curse is gone because 3 minutes might as well be 1 use per round
  • -
  • Shitty wizards can't have a chance to spawn with Cluwnecurse spell
  • -
  • Shit wiz's now have Slip spell instead of Cluwnecurse
  • +
  • cleans up some decals on meta
  • +
  • makes teg console recognize injector and replaces the scrubber with a vent pump
  • +
  • replaces airlock controllers on meta teg with lavaland airlock controllers, should fix taking pressure damage
-

02 February 2024

-

AMyriad updated:

+

08 March 2024

+

Identification updated:

    -
  • Added "np" and "thx" to the netspeak filter
  • -
  • Saying "auxmos" IC now becomes "space wind"
  • +
  • Adds a sprite for ColtonOps, you will know it when you see it.
-

Moltijoe updated:

+

13spacemen updated:

    -
  • xeno embryos now burst significantly faster if the host is alive and buckled to a xeno bed
  • -
  • xeno embryos now burst significantly slower if the host is dead or not buckled to a xeno bed
  • -
  • xeno beds now handcuff the person buckled to it
  • -
  • xeno beds are significantly faster to unbuckle from (if not handcuffed)
  • +
  • Moths, Phytosians, Abductors, Plasmamen, IPCs, Jelly/Slimepeople, Felinids, Polysmorph, all have their own butt sprites
-

Therandomhoboo updated:

+

JamieD1 updated:

    -
  • Nice, Good, Very good and Fantastic quality drinks have their mood changes increased, and their timeouts increased
  • -
  • Allies cocktail mood flavour text is less cringe
  • +
  • Changes Hub Text
- -

31 January 2024

-

ktlwjec updated:

+

LazennG updated:

    -
  • Mime's mail cheesewheel is now visible.
  • -
  • Croissants need raw pastry bases to craft, instead of cooked ones.
  • -
  • Seafood ingredients box for cooks.
  • +
  • added proximity check to suplex
  • +
  • seismic arm suplex bonus damage vs charging bubblegum
-

AMyriad updated:

+

Moltijoe updated:

    -
  • Salicylic acid is now spelled correctly
  • +
  • Fixes a runtime that allows infinite duping of possessed sword nullrods
  • +
  • Adds new wizard spell, scrunch
  • +
  • Fixes a bug where mood wasn't properly forced for everyone
-

Marmio64 updated:

+

Runian updated:

    -
  • Adds jaunt abilities for sinful demons.
  • +
  • Only obtainable via a camera laser upgrade disk (or by being a traitor), the AI can get an ability based around lasers and their cameras.
  • +
  • This new AI ability lets them enter a burst mode which lets them shoot a laser from any functioning camera every second. It lasts for 30 seconds and be re-activated every 60 seconds. Cameras used in this matter are hit with a heavy EMP.
  • +
  • Hitting an AI control console with an upgrade no longer runtimes.
  • +
  • Logging regarding upgrading the AI with disks has better formatting.
-

Mqiib updated:

+

SapphicOverload updated:

    -
  • Chaplain monk staff null rod (stamina) damage increased (15 -> 18)
  • -
  • The above no longer can block projectiles
  • +
  • Liquid plasma tiles cool down gas in radiator loops instead of heating them
-

RG4ORDR updated:

+

Scrambledeggs00 updated:

    -
  • Syndie Borgs Spawners removed from BR loot pool.
  • +
  • Adds the flagellant's chains to chaplain's armament beacon
  • +
  • Adds sprites for the flagellant's chains
-

Runian updated:

+

Therandomhoboo updated:

    -
  • Four tech node dedicated for cyborgs upgrades: Night Vision, Engineering, Mining, and Service. Each costing 500 points.
  • -
  • Various cyborg upgrades have been moved to more relevant/dedicated technodes.
  • -
  • Most tech nodes that involve cyborg upgrades now require the "Advanced Robotics" tech node or a node that already has it as a prerequisite.
  • -
  • Most tech nodes that involve cyborg upgrades have now a better description that explains the purpose of the node.
  • -
  • "Cyborg Upgrades: Advanced Utility" tech node has been renamed to "Cyborg Upgrades: Advanced Engineering".
  • -
  • "Cyborg Upgrades: Advanced Engineering" tech node cost reduced to 2,500 from 5,000.
  • -
  • "Cyborg Upgrades: Utility" tech node cost reduced to 1,500 from 2,000.
  • -
  • "Cyborg Upgrades: Engineering" and "Cyborg Upgrades: Mining" tech node's icon has been changed to better visualize the node.
  • -
  • Janiborg's trashbag of holding upgrade is properly locked behind Advanced Sanitation Technology.
  • -
  • Medical gripper can now hold medsprays, lollipops, pills, patches, gummies, and chemistry bags.
  • +
  • Drunken Resilience back into the fray
  • +
  • Drunk Level 81 & Drunk Level 101 giving heals
  • +
  • Drunk Resilience no longer is culmative healing
-

SapphicOverload updated:

+

warface1234455 updated:

    -
  • beam rifles now create turf fires instead of hotspots
  • -
  • beam rifle projectiles can always reflect off of coins
  • -
  • fixed hitscan projectiles not rendering properly when reflected
  • -
  • fixed beam rifle projectiles not doing damage when fired from turrets or emitters
  • +
  • Healium now heals oxy damage
-

SomeguyManperson updated:

+ +

07 March 2024

+

warface1234455 updated:

    -
  • limb loss in brazil is now worth 7 marbles
  • -
  • limb skeletonization in brazil is now worth 3 marbles
  • -
  • If you somehow manage to run out of limbs while leaving brazil, you will be ejected
  • +
  • Blob now generate research points if inside a containment field
  • +
  • Shuttle will leave when blob is contained inside a containment field
  • +
  • Supermatter blob delam now create blob without ghost poll (you can still click the blob camera to enter the blob if ur not banned or the blob is not occupied by another ghost)
-

jachlompsky updated:

+ +

06 March 2024

+

13spacemen updated:

    -
  • Added a frost oil chem sprayer to the mr freeze syndikit
  • +
  • Chat no longer complains if you have unbound keys
-

warface1234455 updated:

+ +

05 March 2024

+

13spacemen updated:

    -
  • Shitcurity uniform now has fucking armor
  • -
  • Nightshift lights now actually consume less power
  • -
  • Removes other useless power vars as they dont work with the light fixture anyway
  • -
  • Cyborg engineering gripper can now hold server rack and cpu
  • +
  • Human unarmed attack visual effects are based on species instead of the attack verb text
-

wonderinghost updated:

+

N3D6 updated:

    -
  • Cluwncurse takes 3 minutes instead of 1 minute
  • +
  • adds an extra smes unit to donut engi, adds light switches and extra closets to donut engi
-

29 January 2024

-

ktlwjec updated:

+

04 March 2024

+

cark updated:

    -
  • All pizzas need mozzarella to craft (5u enzyme, 30u cow milk, 5u lemon juice).
  • -
  • Mime finger guns properly show what was shot at, and by who.
  • -
  • Mime finger gun button has a working icon.
  • +
  • fixes an issue where psychiatrist on donut didnt have a spawnpoint
-

13spacemen updated:

+

SapphicOverload updated:

    -
  • Compiling the code launches directly into Dream Seeker
  • +
  • walls are now destructible
  • +
+

Scrambledeggs00 updated:

+
    +
  • Fixes book modification
  • +
  • Changes the wording of some book modification prompts
  • +
+ +

03 March 2024

+

JamieD1 updated:

+
    +
  • Added new Title Screens from 2024 Contest

Moltijoe updated:

    -
  • Fixes a bug with polysmorph tail crawlspeed
  • +
  • Properly updates special eye colour upon insert and removal
-

SapphicOverload updated:

+ +

02 March 2024

+

AMyriad updated:

    -
  • fixed budget insulating gloves melting when touching unpowered cables
  • +
  • Adjusted decals and added some spooky flooring to the curator's backroom in the library on Box
  • +
  • Fixed a misplaced decal
-

adamsong updated:

+ +

01 March 2024

+

AMyriad updated:

    -
  • Added option for admins to spawn items directly in a storage container
  • +
  • Patients can now exit from both left and right doors on Box medbay
-

bruhlookatthisdood updated:

+

MajManatee updated:

    -
  • bonesetter spawns during battle royal now
  • +
  • New hugboxed donk-soft vendor for roundstart. Cant load riot darts.
-

cowbot92 updated:

+ +

29 February 2024

+

ktlwjec updated:

    -
  • removes infinite money in the form of syrup
  • +
  • Meatballs in ingredient boxes start off raw.
-

jachlompsky updated:

+

AMyriad updated:

    -
  • fixed lasombra vassals and eye examine
  • +
  • Added a second button to the kitchen on Box to toggle counter shutters
  • +
  • The privacy shutters in the kitchen on Box are now toggled with the bottom (already existing) button
  • +
  • Removed the third blender from the kitchen on Box
  • +
  • Fixed every fire alarm that was facing the wrong direction on Box
  • +
  • Fixed a mountain of decals using the wrong colors on every map
  • +
  • Asteroid maint doors now have clear hazard stripes instead of nearly invisible brown ones
  • +
  • Changed a few bridge decals to look better on every map
  • +
  • Gax telecomms is now color coded, now has nice engie decals in the net admin's office
-

wonderinghost updated:

+

Moltijoe updated:

    -
  • updates min and max values of byond_version_combat
  • +
  • New sandevistan visual effect
  • +
  • Weedkiller does 2x damage to venus human traps than before
  • +
  • Venus human traps can no longer pull
  • +
  • venus human traps now require a pressurized environment
  • +
  • Fixes surgical toolset arm implant visuals
  • +
  • Fixes being unable to select a clan as bloodsucker
  • +
  • Preternis eyes now also care about if a species is powerhungry instead of only robotic
  • +
  • Preternis eyes night vision now consumes power from powerhungry species
  • +
  • Preternis eyes only take damage in non powerhungry species when nightvision is turned on
  • +
  • Powered ruins properly start with lights on if they have a lightswitch
  • +
  • Wizards can now cast iron
  • +
  • Lets hecata necromancy poll ghosts into mindless corpses
  • +
  • Lets admins force a specific bloodsucker clan on people
-

ynot01 updated:

+

Mqiib updated:

    -
  • Live xeno aliens on station level now passively generate research points
  • +
  • Light step now stops your shoes from getting dirty again
- -

28 January 2024

SapphicOverload updated:

    -
  • fixed being unable to analyze the instability of cold fusion reactions
  • -
  • IPCs, androids, polysmorphs, and slimepeople now have unique typing indicators
  • -
  • Using harm intent makes your typing indicator angry
  • +
  • Goliath hide plates can be attached to APLU mechs again
-

adamsong updated:

+

ToasterBiome updated:

    -
  • fixed mfa backup codes not working
  • +
  • quirks won't delete themselves from your characters if you load in fast anymore

cowbot92 updated:

    -
  • Makes the deep fryer hungry, occsionally
  • -
  • fixed the faded eyepatch not giving you night vision despite it telling you it does
  • +
  • Added new smite: wibblify
- -

27 January 2024

-

ktlwjec updated:

+

warface1234455 updated:

    -
  • Removes a line in the sith cloak sprite.
  • +
  • You can now go through atmos resin with slowdown.
  • +
  • Changed resin description
- -

26 January 2024

-

Runian updated:

+

wonderinghost updated:

    -
  • Shooting a cyborg snack dispenser while in a zero gravity environment correctly starts moving you in the opposite direction that you shot it.
  • +
  • updates max byond version to .1640
-

23 January 2024

-

Moltijoe updated:

+

28 February 2024

+

13spacemen updated:

    -
  • Fixes an issue with blood decals
  • +
  • Mimes get their own special survival boxes
  • +
  • Plasmaman clowns will properly get their plasma tank in their hugbox
-

22 January 2024

+

27 February 2024

+

axietheaxolotl updated:

+
    +
  • Added pride pins
  • +
+

13spacemen updated:

+
    +
  • Humans have shoe footprints again
  • +

Moltijoe updated:

    -
  • Added new maroon organ objective for traitors to roll
  • -
  • Traitor break machinery objective only requires breaking the original machines
  • -
  • Traitor break machinery targets at max 2 areas instead of up to 4
  • +
  • Fixes being unable to place items in closets or crates
  • +
  • Miners and mining medics now properly cause the mining base to start with the lights on
  • +
  • Fixes bugs with blood type compatibility
  • +
  • venus human trap bulb vines properly get destroyed when the bulb is
  • +
  • fixes a bug where emissive bodyparts showed as white in the character menu

Mqiib updated:

    -
  • Imperial jumpsuits don't have alt styles, stop trying to break the dress code soldier!
  • +
  • Adds the new Black Mamba for nuclear operatives to play with
  • +
  • Adds two new venom-related weapons for the Mamba
-

Yarinoi updated:

+

SapphicOverload updated:

    -
  • 'Solo' special syndi-kit is now slightly more balanced. David. David you aren't going to let this stop you are you David. Get to work David ignore the EMPs. Take your pills get to work.
  • +
  • Fixed clothes that don't cover your hands protecting your hands from electric shock
- -

21 January 2024

-

ktlwjec updated:

+

adamsong updated:

    -
  • Mammi and Pea Soup need bowls to craft.
  • +
  • fixed info command showing numerical security levels
-

20 January 2024

-

kugamo, warface1234455 updated:

+

26 February 2024

+

Moltijoe updated:

    -
  • Resprites the Bluespace Harvester.
  • -
  • Also also slightly changes the nether portals event, so that the portals spawn sequentially over at most 15 seconds.
  • +
  • Traitors can no longer roll whiteship or freeminer machines for the destroy objective
- -

19 January 2024

-

SapphicOverload updated:

+

Mqiib updated:

    -
  • added stairs to icemeta's mining base
  • -
  • added directional stairs icons
  • -
  • fixed regenerative cores having a delay on icemoon
  • +
  • Undoes accidental revert pertaining to bloody footprints
-

warface1234455 updated:

+

cowbot92 updated:

    -
  • Fix invisible netmin wintercoat hood
  • -
  • Bring back Raven cruiser emergency shuttle
  • +
  • Removed mindreading
  • +
  • tweaked cerebral neuroplasticity gene
- -

18 January 2024

-

SapphicOverload updated:

+

redmoogle updated:

    -
  • made the chat message from losing obsession more visible
  • -
  • you can now place items on the altar of the gods without having to climb on top of it
  • +
  • Examining cutter mods shows you cost and stackability
-

17 January 2024

-

Loiosh42 updated:

+

25 February 2024

+

Cowbot92 & Chubbigummybear updated:

    -
  • Adds an ignition_effect to the cautery.
  • +
  • fixes most floor stuff you walk over not working
- -

15 January 2024

-

bruhlookatthisdood updated:

+

cark updated:

    -
  • Waiting For The Sun (Rimworld OST) is in jukebox now
  • +
  • Added a new disease which turns you into a crab
-

cowbot92 updated:

+

AMyriad updated:

    -
  • fixes decals
  • +
  • Removed all old PDA cartridges from all lockers, vendors, and tables on all stations excluding the clerk's gift vendor
  • +
  • Revised the flavor text on old PDAs to reflect their status as outdated, "antique" pieces of equipment
  • +
  • Replaced the old ID console from the CE's office on icemeta with the newer modular console
- -

13 January 2024

-

SapphicOverload updated:

+

Marmio64 updated:

    -
  • fixed chat not always showing up in replays
  • +
  • Adds the Den of Sin, a jungleland casino run by a demon.
  • +
+

Moltijoe updated:

+
    +
  • No more zombies in xenobio
  • +
  • Preternis eyes glow purple when nightvision is active
  • +
  • Battle royale
  • +
  • Certain species bodyparts now glow in the dark
  • +
  • Adds S.E.L.F. ipcs and S.E.L.F. insurgents
  • +
  • Synths and Military synths
  • +
  • Syndicate bounties
  • +
  • Lights no longer start off except for empty departments
  • +
  • adds a cooldown to light flickering from explosions/etc
  • +
  • Skittish now works properly for crates
- -

12 January 2024

SapphicOverload updated:

    -
  • adds more winter coats
  • -
  • moves winter coat and hood sprites to their own files
  • +
  • Added a unit test for fusion reactions
  • +
  • Fixed fusion reactions not working in the atmospherics simulator computer
  • +
  • Fixed hydraulic clamp not being able to pick up lockers or deconstruct tables
  • +
  • Ripley MK-II and Firefighter have been merged into the same mech
-

Therandomhoboo updated:

+

Yarinoi updated:

    -
  • Astrotame, bbq, sugar, cream & chocolate are now 10u's instead of 5.
  • -
  • Chocolate packets are now correctly called chocolate packets instead of Creamer....
  • +
  • added new chaplain hat icons
  • +
  • removed old chaplain hat icons :exploding_head:

warface1234455 updated:

    -
  • FIx preset programs arent installed in pda/phone
  • +
  • Raise the HFR's healium healing threshold from 66.66% to 90%.
  • +
  • Fix apc building and unnable to change electric armor value from VV
  • +
  • Add pluoxium + antinoblium gas recipe to HFR
  • +
  • fix tier 2 moderator pluonium production output on tgui
-

11 January 2024

-

Runian updated:

+

24 February 2024

+

ktlwjec updated:

    -
  • The description of ammo boxes now accurately show how much bullets are left when you use an ammo box on another ammo box.
  • +
  • Lightens the outline for the bag of holding in-hand sprites.
- -

10 January 2024

-

AMyriad updated:

+

13spacemen updated:

    -
  • Dusted plasmamen now have plasma remains
  • +
  • Footprints are now based on what shoes you're wearing and what legs you have
  • +
  • Fixed bloody item overlays leaking onto other objects
-

Runian updated:

+

AMyriad updated:

    -
  • Override Machine and Overload Machine abilities (from malf AI/malf upgrade disk) now work.
  • -
  • Nerve Grounding and other ways that change your physiology's siemens coeff properly protect you from getting electrocuted.
  • +
  • Fixed every description that didn't begin with a capital letter, make a bug report if you find something I missed
  • +
  • MMIs and positronic brains can no longer be printed from the medical techfab
-

Scrambledeggs00 updated:

+

Mqiib updated:

    -
  • Added a new thing to IceMeta
  • -
  • Sprites for the new thing
  • +
  • The clarke is now tied for fastest mech in the game with the ripley mk-I
  • +
  • Mech melee weapons now also hit vines properly when using cleave attacks
-

ToasterBiome updated:

+

SapphicOverload updated:

    -
  • rating polls now work properly
  • -
  • Updates maintainer list and thanks more stations in our special thanks section
  • +
  • flamethrowers now react their fuel for damage and effects instead of using pre-determined values
  • +
  • flamethrower tanks release some of their contents when shot instead of just deleting themselves
  • +
  • flamethrowers can hit vines on windows
  • +
  • fixed flamethrowers sometimes using more fuel than intended
-

bruhlookatthisdood updated:

+

cowbot92 updated:

    -
  • ASay and DSay are now no longer visible to non-admins
  • +
  • Ports baton light up from TG
-

wonderinghost updated:

+

warface1234455 updated:

    -
  • fixed my mistakes
  • -
  • makes the prior pr picture perfect
  • +
  • HFR gas byproducts now uses scaled_production instead of fuel_consumption, and now scaled alongside with gas produced from moderator, code refactor
-

09 January 2024

-

Aquizit updated:

+

23 February 2024

+

Cowbot92 & Chubbygummibear updated:

    -
  • The innkeeper can now get stuff from their booze-o-matic and kitchen vending machines.
  • +
  • Fixes a bunch of stuff you step on
  • +
  • Added new traitor item, the gasharpoon
- -

08 January 2024

-

cark updated:

+

Chubbygummibear updated:

    -
  • fixes some railings in bar
  • -
  • Reenables Icemoon Walkers
  • +
  • auto_profile config flag added to the private default and private server config files
  • +
  • private servers aren't dumpy unless you specifically request them to be
  • +
  • main yog server will be extra dumpy because we can handle it
  • +
  • no more double clerk and chaplain workplace spawns
-

Therandomhoboo updated:

+

Moltijoe updated:

    -
  • Moonshine now makes you gain blurry, long live blurry vision
  • +
  • New ethereal bodyparts
  • +
  • Old ethereal bodyparts
-

05 January 2024

-

AMyriad updated:

+

21 February 2024

+

Identification updated:

    -
  • Updated the storage implant's toggle sprite
  • +
  • Restores walls to true top-down.
-

EdgeLordExe updated:

+

sapphicoverload, syncit21, zxaber updated:

    -
  • New Mining area: Jungleland, Most content added by Djiq, Most ruins, some mobs and Ivymen added by Marmio64. Other ruins added by ToasterBiome. Various fixes and updates by courtesy of Jamie1D and SapphicOverload!
  • -
  • New Mobs now appear on jungleland, such as Meduracha, Dryads, Giant mosquitoes, and Skin Twisters!
  • -
  • New Mining implement: Kinetic Javelin, get it either from the roundstart kit, or buy it in a mining vendor.
  • -
  • New Megafauna: Tar King - You can summon it by collecting 3 parts of a broken crystal, assembling it, and placing it in a Forgotten Altar!
  • -
  • Ivymen - Jungleland's counterpart to ashwalkers, by Marmio64
  • -
  • Jungleland has many new biomes, beware of sulphuric pits, as it will cause you trouble if you step into it.
  • -
  • Added new icons and icon states for jungleland
  • -
  • Added Jungleland as a new mining destination!
  • +
  • added a bunch more equipment for utility mechs
  • +
  • adds new sound effects for hydraulic clamp and APLU mech movement
  • +
  • hydraulic clamp works as a wrench or crowbar and can pry powered doors
  • +
  • mech plasma cutter can be used as a welder like the handheld version
  • +
  • mech RCD works like an actual RCD now
  • +
  • adds tgui RCD menu
  • +
  • strafe button icon shows whether or not you're strafing
  • +
  • APLU and Clarke mechs now have radiation shielding
  • +
  • fixed clarke movement not working correctly
  • +
  • fixes and re-adds multi-Z mech movement (no phasing through floors or teleporting to other z-levels this time)
- -

04 January 2024

-

ZephyrTFA, san7890 updated:

+

13spacemen updated:

    -
  • fixed chat messages not showing up sometimes
  • +
  • The latejoin menu no longer has anemia.
-

Aquizit updated:

+

AMyriad updated:

    -
  • Removed disposals air alarm
  • -
  • Moved windoor in disposals
  • -
  • Scrubs a couple bad AI Ion Law things
  • +
  • Fixed the eye of god expose cooldown going off when an invalid target is selected
  • +
  • Fixed mention of Weyland-Yutani appearing in the ripley mech repair manual
  • +
  • "Hyperspace" no longer exists and never did, FTL travel is achieved by tunneling through bluespace
  • +
  • Players can no longer relabel gas canisters to a variant that's intended for admins and breaks the 4th wall
-

Runian updated:

+

Chubbygummibear updated:

    -
  • The threshold description for symbiotic regeneration is now accurate.
  • +
  • index_out_of_bounds fixed on blend_cutoff_colors
  • +
  • turfs that smooth will spur their neighboring turfs to check their smoothing again when late loaded in
  • +
  • cables on the correct plane so they don't have weird lattice lighting filters
  • +
  • meteors with space lighting overlays rotate with the meteors instead of being disjointed and unmoving
  • +
  • shuttle atmos shouldn't get left behind on takeoff
-

SapphicOverload updated:

+

LazennG updated:

    -
  • polysmorph tails slightly increase crawl speed
  • -
  • fixed printed IPCs having human names instead of IPC names
  • -
  • supermatter crystal and nuclear reactor are less unstable
  • -
  • footstep sounds actually work again
  • +
  • fixed seismic suplex animation and some text
-

Therandomhoboo updated:

+

adamsong updated:

    -
  • Slurring now happens based on what kind of drinker you are (Light, normal or heavy drinker which are based on traits)
  • -
  • Slurring duration changed based on drinker type
  • -
  • The constant chance to randomly slur, we can drink now
  • +
  • fixed shuttle catastrophe
  • +
  • fixed admin shuttle manipulator
- -

03 January 2024

-

Cowbot92 & Molti updated:

+

cowbot92 updated:

    -
  • tweaks how blood works
  • -
  • adds new blood
  • -
  • removes the old bad blood
  • -
  • fear the old blood
  • +
  • adjust some pop requirements for several antags
-

Moltijoe updated:

+

redmoogle updated:

    -
  • Ethereal eyes now give +1 view range
  • +
  • PC Range Upgrade
  • +
  • PC Cooldown Upgrade
  • +
  • Vending machines not containing upgrades
  • +
  • All plasma cutters can be upgraded
  • +
  • Plasmacutters can be recharged with one click now
  • +
+

warface1234455 updated:

+
    +
  • Partially revert undocumented change to shutter/blastdoor layer covering window but still keep the blast door covering the door
-

29 December 2023

-

SapphicOverload updated:

+

20 February 2024

+

Chubbygummibear updated:

    -
  • exosuits now have directional lights, with much longer range
  • +
  • fix adminwho by skipping null clients in the admin list
-

ToasterBiome updated:

+

cowbot92 updated:

    -
  • Project Bee has a new sprite and description
  • +
  • fixed beartraps not trapping
-

jupyterkat updated:

+

warface1234455 updated:

    -
  • updated auxmos to latest
  • +
  • cable coil maxstacks is now 40
-

25 December 2023

-

cark updated:

+

19 February 2024

+

SapphicOverload updated:

    -
  • Icemoon Hermit's home has been improved with more amenities
  • -
  • fixes there being too many firelocks under a door in AI sat on Donut
  • +
  • RCDs work on space tiles again
  • +
  • Fixed space lighting not working in space
  • +
+ +

18 February 2024

+

Chubbygummibear, cowbot92, JohnFulpWillard, ToasterBiome, LazennG, Moltijoe, LemonInTheDark, azzzertyy updated:

+
    +
  • Rendering backend is like 200% different
  • +
  • stuff glows in the dark
  • +
  • Overlay smoothing is dead
  • +
  • Cameras and other popup maps work on clients >1615
  • +
  • mapmerge tool shouldn't blow up multi-z maps anymore
  • +
  • Yes
  • +
  • icemeta got flipped but it should be the same from top to bottom
  • +
  • yeah

Moltijoe updated:

    -
  • Adds more tool options for ghetto mechanical surgery
  • -
  • existing ghetto mechanical surgery options are slightly better
  • +
  • Adds stuff for Hisa to bus with
  • +
  • Sound for bussing stuff
  • +
  • Images for bussing stuff
-

N3D6 updated:

+

ToasterBiome updated:

    -
  • moves smes units from engi foyer to the former gravity generator area on icemeta
  • +
  • Removes arrival shuttle from NVS Gax, people spawn in cryo now
  • +
+

cowbot92 updated:

+
    +
  • Removed Yellow Jacket Matriarchs from the gold slime pool
-

24 December 2023

+

17 February 2024

+

cark updated:

+
    +
  • Added a new lobby song for Valentine's Day "Be My Valentine" by Tim McMorris
  • +

Moltijoe updated:

    -
  • Lets hand-based extinguishing be used on corpses
  • -
  • Gives polysmorph minor resistance to pressure damage
  • -
  • Preterni no longer regenerate blood
  • +
  • TRAIT_HARDLY_WOUNDED now actually does what it says
-

Runian updated:

+

Mqiib updated:

    -
  • Trying to remove decoy brains from MMIs properly works.
  • -
  • Removing MMI brains from range no longer teleport it into your hands if you're far away (e.g. through walls/windows with TK). Same for folding paper.
  • -
  • Ending punctuation for ripping out brain from MMI.
  • -
  • IPCs now play their special walk sound when they move as intended.
  • -
  • Emagging/hacking cyborg event typo: privleges -> privileges
  • +
  • Mechs without any power are no longer immune to EMPs
-

SapphicOverload updated:

+

ToasterBiome updated:

    -
  • fixed a runtime error caused by steamed hams
  • -
  • fixed meson goggles not protecting you from looking at the supermatter crystal
  • -
  • being on fire no longer gives a negative moodlet if you're immune to fire
  • +
  • Traitor AIs can no longer edit their laws.
  • +
  • Paladin now has the correct laws again.
-

azzzertyy updated:

+

cowbot92 updated:

    -
  • Removes the "WARNING. THE WAY AI IS PLAYED HAS CHANGED" message when joining as AI
  • +
  • Adds new donut recipie
-

hedgehog1029 updated:

+

redmoogle updated:

    -
  • XL beakers show contained chemicals again
  • +
  • Plasma shotgun can no longer steal your stuff
-

23 December 2023

-

bruhlookatthisdood updated:

+

16 February 2024

+

Mqiib updated:

    -
  • fixed a lot of ai blind spots
  • +
  • Tweaked female neck pixel to make clothes look better on non-humans
-

21 December 2023

+

15 February 2024

+

@Chubbygummibear @LazennG updated:

+
    +
  • Added new martial art for seismic arm
  • +
  • Removed old seismic arm actions
  • +
+

ktlwjec updated:

+
    +
  • Ice cream vat tells you that vanilla ice cream needs vanilla powder to make.
  • +
  • Grape snowcone recipe changed from 5u berry juice to 5u grape juice.
  • +
+

Aquizit updated:

+
    +
  • No longer told to ahelp when cryoing as a valentine
  • +
+

Moltijoe updated:

+
    +
  • New wizard spell, bestow appendicitis
  • +
  • Bad wizard that previously had curse of cluwne (before it was removed) now gets appendicitis
  • +

Runian updated:

    -
  • Various mood descriptions now properly start on a new line.
  • -
  • Space cigarettes now properly spawn with their branded cigarette rather than the base cigarette.
  • -
  • Ending punctuation for a few mood descriptions.
  • -
  • Removing/extracting IPC's positron brain properly moves their mind.
  • -
  • Spells properly transfer over from one mob to another; e.g. wizard shapechange & xenobio burning black shapechange.
  • -
  • Rune scimitar works as intended; you can now properly grind and obtain loot.
  • +
  • Newly created cyborgs with an closed AI Connection Port do not inherit an AI's laws (if any) before getting desynced.

SapphicOverload updated:

    -
  • cryo pod joining puts you inside the pod instead of on the ground
  • +
  • radial menus show up when you're inside an object
  • +
+

redmoogle updated:

+
    +
  • Shitcurity jumpsuit shows up
  • +
  • Light switches are no longer a free source of frames
  • +
  • Fixed RLS description
  • +
  • Teleport + Jump to Area have been merged together
  • +
  • new PS upgrade: doubles the capacity
-

azzzertyy updated:

+

tattax updated:

    -
  • Ambience follows ai eye rather than its core.
  • -
  • Added paystand to bar and kitchen, decreased wideness of kitchen, made the raised section look logical.
  • +
  • fixed spells statpanel not working
  • +
  • fixed golden violin devil spell (lol)
  • +
+

thorium90cent updated:

+
    +
  • rain on brick from katana zero is now apart of the jukebox
-

20 December 2023

-

Mqiib updated:

+

13 February 2024

+

ktlwjec updated:

    -
  • Fixes spray cans/crayons not working
  • +
  • Removes stray pixels from a couple of medikits.
-

Runian updated:

+

warface1234455 updated:

    -
  • You can now use a wrench to anchor armed beartraps after a second delay. It can be disarmed with an empty hand with a second delay.
  • -
  • Message for arming and disarming beartraps properly ends with a period.
  • +
  • Give HFR gas monitoring bar a decreasement/increasement rate rate
  • +
  • Moderator now list all sticky gases
  • +
  • increase HFR effciency due to recent process change that decreased HFR performance
  • +
  • dirty production rate no longer relies on fuel injection rate and instead fully rely on the amount of byproduct gas in the reaction
-

ToasterBiome updated:

+ +

12 February 2024

+

Moltijoe updated:

    -
  • Removes arrival shuttle from NVS Gax, people spawn in cryo now
  • +
  • Makes a small minor mini tweak to some battle royale weapon weights
-

ynot01 updated:

+

wonderinghost updated:

    -
  • Disarming someone holding a gun now has a high chance to force them to fire
  • +
  • fixes holoparasites ability to break cuffs
  • +
  • swarmer cuffs take 20 seconds instead of 45
  • +
  • converts cuff deci seconds to seconds
  • +
  • added sprite to alien cuffs
-

19 December 2023

-

Scrambledeggs00 & Molti updated:

+

11 February 2024

+

AMyriad, Wallem, Vincent938, The-Moon-Itself updated:

    -
  • new vampire cloak
  • -
  • old vampire cloak
  • +
  • You can now construct, deconstruct, and print mass drivers
  • +
  • You can also hack mass drivers now
  • +
  • Mass driver base power reduced from 50 to 10, can be upgraded or hacked to increase it
  • +
  • Mass drivers also have sound effects now!
  • +
  • Updated the mass driver sprite(s)
-

cark updated:

+

AMyriad updated:

+
    +
  • Standardized all mentions of the Clockwork "Justicar" into "Justiciar"
  • +
+

Loiosh42 updated:

    -
  • fixes mislabeled cameras in chapel on box
  • +
  • Adds an Anti-megafauna ERT, mk2
-

cark, cowbot93 updated:

+

MajManatee updated:

    -
  • improves new bar by fixing issues and adding coffee
  • +
  • Holopads stop recording/playback when wrenched
-

SapphicOverload updated:

+

Moltijoe updated:

    -
  • icemeta's useless solar arrays have been replaced with geothermal power stations
  • +
  • Confusion modified to not scale up to completely randomized movement
  • +
+

Mqiib updated:

+
    +
  • Flying fang inaccuracy debuff now actually goes away fully instead of stacking infinitely
  • +
  • Leaping with air shoes makes you fall over
  • +
  • Blocking the flying fang leap helps significantly but won't totally save you
  • +
  • Disarm chain defaults to basic harm intent attacks when prone
  • +
  • Mechs don't deflect ion bolts any more
  • +
+

Runian updated:

+
    +
  • Silicon Law Manager has been added.
  • +
  • Antag AIs can modify their laws with exceptions. They cannot remove their zeroth law (or their devil laws).
  • +
  • "State Laws" has been replaced/moved to the Law Manager.
  • +
  • "Set Auto Announce Mode" has been replaced/moved to Law Manager.
  • +
  • You can no longer view a law module's laws by using it in hand and has been replaced with examining.
  • +
  • The unused and unobtainable "malfunction" lawset was removed.
  • +
  • Examining a law module has been improved and also reveals the laws on it if you are near it or are an observer. Now with formatting!
  • +
  • Silicons now have an easier time setting their auto announcement to Holopad and Binary.
  • +
  • Trying to upload an another law that has the same exact text as a previous law in the same category simply doesn't upload it as panic/spam prevention.
  • +
  • Core preset lawset boards ignores the law cap limit and should no longer causes accidental purges of all inherent laws for AIs.
  • +
  • Changing a pAI's laws is now logged in their history.
  • +
  • RoboTact's law section displays laws without any formatting that comes from things like ion/hacked laws.
  • +
+

bruhlookatthisdood updated:

+
    +
  • donut station's tachyon-doppler array is facing the right way now.
- -

18 December 2023

cowbot92 updated:

    -
  • Adjusts the singulo/tesla engine template
  • +
  • Removes the donksoft vendor from asteroid
- -

17 December 2023

-

SapphicOverload updated:

+

wonderinghost updated:

    -
  • fixed a bunch of things being able to behead when they shouldn't
  • -
  • fixed roboticists not having robotics access
  • +
  • max tabs in microprocessors have been reduced by one
  • +
  • telescreens can now download camera software
  • +
  • construction bag can now hold computer parts
  • +
  • wired network card has added one bulk to advanced network card
  • +
  • pdas and phones can accept small computer parts
  • +
  • adds box and meta TEG to engine rotation.
-

15 December 2023

-

Mqiib updated:

+

10 February 2024

+

Identification & Molti updated:

    -
  • You can now use darker colors on canvases.
  • +
  • Adds a new preternis body colour
  • +
  • adds new preternis eye option
  • +
  • adds new preternis wings
-

ToasterBiome updated:

+

Aquizit updated:

    -
  • Removes species pay modifiers
  • +
  • Laying pipe
  • +
+

Runian updated:

+
    +
  • Decreases the unintended burn damage reduction from 2 to 1 for preternis limbs.
  • +
  • The genetics power, Shock Touch, causes confusion down from 15 seconds to 3 seconds. Can be reduced/increased based on targeted electric armor.
-

14 December 2023

-

Mqiib, @RG4ORDR @SapphicOverload updated:

+

09 February 2024

+

Mqiib, @Ebin-Halcyon updated:

    -
  • Sidewinder mechs made moderately tougher
  • -
  • Sidewinder mechs slightly better in melee than before
  • -
  • Sidewinder mechs have superior projectile deflection, watch those lasers!
  • -
  • Directional damage modifiers and deflection modifiers work for melee too now
  • -
  • Demolition modifiers are half-effective versus non-combat mechs and completely ineffective vs combat mechs
  • +
  • Added new turtlenecks for cargo, CMO, and HoP!
-

cark updated:

+

ToasterBiome updated:

+
    +
  • hermes boots no lonnger create runtimes when walking
  • +
+

cowbot92 updated:

    -
  • fixed some issues on donut
  • -
  • certain items now give chems they did not before
  • +
  • Tweaks changeling abilities
-

cark, azzzertyy updated:

+ +

08 February 2024

+

Identification, Molti, lore team (rip skrem) updated:

    -
  • Redesigns Box's bar/kitchen, nukes all the old templates and moves theatre north to fitness.
  • +
  • new preternis sprites
  • +
  • old preternis sprites
-

AMyriad updated:

+ +

06 February 2024

+

Cowbot92 & Chubbygummibear & Mqiib updated:

    -
  • Added Biosignaller implants to nuke ops and ERTs, which alert their teammates when and where they died
  • -
  • Syndicate ghost roles now have a survival box
  • +
  • adjusts how emagged minesweeper rewards/works
  • +
  • adjusts the sound of syndicate mines

Moltijoe updated:

    -
  • Reworks superficial healing
  • +
  • Battle Royale
-

Mqiib updated:

+

warface1234455 updated:

    -
  • Actually buffs the immolator this time
  • -
  • Base mech vs mech damage multiplier for melee weapons and punches reduced
  • -
  • Energy axe and rapier mech multipliers tweaked
  • -
  • Mech katana damage bonus and AP increased
  • +
  • Airalarm draught mode now set scrubber range from normal to expanded
-

SapphicOverload updated:

+ +

05 February 2024

+

AMyriad updated:

    -
  • fixed snowstorms bypassing cold protection
  • -
  • adds electrical and heat protection to engineering envirosuit helmets
  • +
  • Chemist ID card no longer looks like the prisoner ID card
-

ToasterBiome updated:

+

SapphicOverload updated:

    -
  • Changes NVS Gax Robotics to be more open
  • -
  • Mood is globally enabled for everyone
  • -
  • Map rotations and player votes no longer offer maps if they were played the last 70% of rounds
  • -
  • Adds a new Christmas song to the lobby music for Christmas!
  • +
  • reactions happening in tanks now know they're reacting inside a tank
  • +
  • buckling to operating tables no longer requires cuffs
-

bruhlookatthisdood updated:

+ +

04 February 2024

+

AMyriad updated:

    -
  • you can now hit the captain's gun case
  • +
  • Corporate Agents are now gone. Don't know what they are? Exactly nobody does, they won't be missed
-

cowbot92 updated:

+

Therandomhoboo updated:

    -
  • Adds coffee machine to the new bar
  • -
  • Maps it duh
  • +
  • Cluwne Curse is gone because 3 minutes might as well be 1 use per round
  • +
  • Shitty wizards can't have a chance to spawn with Cluwnecurse spell
  • +
  • Shit wiz's now have Slip spell instead of Cluwnecurse
-

13 December 2023

+

02 February 2024

AMyriad updated:

    -
  • Captains can now access their antique gun display case on Gamma alert or higher
  • +
  • Added "np" and "thx" to the netspeak filter
  • +
  • Saying "auxmos" IC now becomes "space wind"
-

Mqiib updated:

+

Moltijoe updated:

    -
  • Immolator laser gun cooldown reduced (0.8s -> 0.5s)
  • +
  • xeno embryos now burst significantly faster if the host is alive and buckled to a xeno bed
  • +
  • xeno embryos now burst significantly slower if the host is dead or not buckled to a xeno bed
  • +
  • xeno beds now handcuff the person buckled to it
  • +
  • xeno beds are significantly faster to unbuckle from (if not handcuffed)
-

Runian updated:

+

Therandomhoboo updated:

    -
  • Regenerative cores cannot be put into autosurgeons.
  • +
  • Nice, Good, Very good and Fantastic quality drinks have their mood changes increased, and their timeouts increased
  • +
  • Allies cocktail mood flavour text is less cringe
-

bruhlookatthisdood updated:

+ +

31 January 2024

+

ktlwjec updated:

    -
  • Moved items in captain's office to make them more accessible
  • +
  • Mime's mail cheesewheel is now visible.
  • +
  • Croissants need raw pastry bases to craft, instead of cooked ones.
  • +
  • Seafood ingredients box for cooks.
- -

12 December 2023

-

SapphicOverload updated:

+

AMyriad updated:

    -
  • new virology symptom: symbiotic regeneration
  • -
  • fixed HFR heating not taking delta_time into account
  • -
  • updates a bunch of engineering-related sprites
  • +
  • Salicylic acid is now spelled correctly
-

azzzertyy updated:

+

Marmio64 updated:

    -
  • Removed Hippocratic from roundstart lawsets.
  • -
  • Icemeta disposals now reroutes into the plasmariver.
  • +
  • Adds jaunt abilities for sinful demons.
-

cowbot92 updated:

+

Mqiib updated:

    -
  • Adds new coffee machines
  • -
  • Adds new sound for coffee machine
  • -
  • Adds coffee related sprites
  • +
  • Chaplain monk staff null rod (stamina) damage increased (15 -> 18)
  • +
  • The above no longer can block projectiles
-

tattax updated:

+

RG4ORDR updated:

    -
  • fixed a non-human storage hotkey, "E", bug
  • +
  • Syndie Borgs Spawners removed from BR loot pool.
- -

11 December 2023

-

Moltijoe updated:

+

Runian updated:

+
    +
  • Four tech node dedicated for cyborgs upgrades: Night Vision, Engineering, Mining, and Service. Each costing 500 points.
  • +
  • Various cyborg upgrades have been moved to more relevant/dedicated technodes.
  • +
  • Most tech nodes that involve cyborg upgrades now require the "Advanced Robotics" tech node or a node that already has it as a prerequisite.
  • +
  • Most tech nodes that involve cyborg upgrades have now a better description that explains the purpose of the node.
  • +
  • "Cyborg Upgrades: Advanced Utility" tech node has been renamed to "Cyborg Upgrades: Advanced Engineering".
  • +
  • "Cyborg Upgrades: Advanced Engineering" tech node cost reduced to 2,500 from 5,000.
  • +
  • "Cyborg Upgrades: Utility" tech node cost reduced to 1,500 from 2,000.
  • +
  • "Cyborg Upgrades: Engineering" and "Cyborg Upgrades: Mining" tech node's icon has been changed to better visualize the node.
  • +
  • Janiborg's trashbag of holding upgrade is properly locked behind Advanced Sanitation Technology.
  • +
  • Medical gripper can now hold medsprays, lollipops, pills, patches, gummies, and chemistry bags.
  • +
+

SapphicOverload updated:

    -
  • Adds a job blacklist to certain quirks
  • +
  • beam rifles now create turf fires instead of hotspots
  • +
  • beam rifle projectiles can always reflect off of coins
  • +
  • fixed hitscan projectiles not rendering properly when reflected
  • +
  • fixed beam rifle projectiles not doing damage when fired from turrets or emitters

SomeguyManperson updated:

    -
  • plasma fixation now heals significantly more while standing in a room full of plasma
  • +
  • limb loss in brazil is now worth 7 marbles
  • +
  • limb skeletonization in brazil is now worth 3 marbles
  • +
  • If you somehow manage to run out of limbs while leaving brazil, you will be ejected
- -

09 December 2023

-

Farquaar, ArcaneDefence, Cark updated:

+

jachlompsky updated:

    -
  • added plasmamen screams
  • +
  • Added a frost oil chem sprayer to the mr freeze syndikit
-

Mothblocks, san7890, SpaceManiac, Sinsinins, ZephyrTFA updated:

+

warface1234455 updated:

    -
  • Adds EZDB
  • +
  • Shitcurity uniform now has fucking armor
  • +
  • Nightshift lights now actually consume less power
  • +
  • Removes other useless power vars as they dont work with the light fixture anyway
  • +
  • Cyborg engineering gripper can now hold server rack and cpu
-

cark, azzzertyy updated:

+

wonderinghost updated:

    -
  • Redesigns captain's office on box
  • +
  • Cluwncurse takes 3 minutes instead of 1 minute
-

Aquizit updated:

+ +

29 January 2024

+

ktlwjec updated:

    -
  • IceMeta Hermit and Walker ruins can now spawn.
  • -
  • Rewrote Hermit flavor text.
  • -
  • Walkers currently disabled in config since map needs editing now that it is no longer underground.
  • +
  • All pizzas need mozzarella to craft (5u enzyme, 30u cow milk, 5u lemon juice).
  • +
  • Mime finger guns properly show what was shot at, and by who.
  • +
  • Mime finger gun button has a working icon.
-

Moltijoe updated:

+

13spacemen updated:

    -
  • Fixes a bug with the possessed blade
  • -
  • Changes sheltered into a neutral quirk that gives 0 quirk points
  • +
  • Compiling the code launches directly into Dream Seeker
-

N3D6 updated:

+

Moltijoe updated:

    -
  • demonic frost miner no longer spawns
  • +
  • Fixes a bug with polysmorph tail crawlspeed

SapphicOverload updated:

    -
  • fixed water gun spilling gases when it shouldn't
  • -
  • water gun can be drained into containers or emptied
  • -
  • water gun can be refilled from water tanks
  • +
  • fixed budget insulating gloves melting when touching unpowered cables
-

azzzertyy updated:

+

adamsong updated:

    -
  • Reworded cowboy to be clearer
  • -
  • Chaplain can now choose their chapel
  • +
  • Added option for admins to spawn items directly in a storage container

bruhlookatthisdood updated:

    -
  • Added a warrant console outside gax brig and a pay stand to gax brig control
  • +
  • bonesetter spawns during battle royal now
-

cuackles updated:

+

cowbot92 updated:

    -
  • fixes the chaplain helmet
  • +
  • removes infinite money in the form of syrup
- -

08 December 2023

-

cowbot92 updated:

+

jachlompsky updated:

    -
  • Adds 3 new barsigns
  • -
  • Adds new barsign images
  • +
  • fixed lasombra vassals and eye examine
- -

07 December 2023

-

LoliconSlayer updated:

+

wonderinghost updated:

    -
  • Tweaked the names of a few mech melee weapons
  • +
  • updates min and max values of byond_version_combat
- -

06 December 2023

-

AMyriad updated:

+

ynot01 updated:

    -
  • Scrubbed the second "m" from the last mentions of "Centcomm"
  • -
  • All mentions of "NanoTrasen" have also been corrected to "Nanotrasen"
  • -
  • Added some more words and fixed some old ones for the Nordic accent
  • +
  • Live xeno aliens on station level now passively generate research points
+ +

28 January 2024

SapphicOverload updated:

    -
  • HFR processes at the same rate as other atmos machines now
  • -
  • fixed extended lungs
  • -
  • fixed a few issues with the tgui for supermatter monitor, HFR control panel, atmos scanner, and filters/scrubbers
  • -
  • fixed ethereal stomachs having the EMP effects of IPCs
  • +
  • fixed being unable to analyze the instability of cold fusion reactions
  • +
  • IPCs, androids, polysmorphs, and slimepeople now have unique typing indicators
  • +
  • Using harm intent makes your typing indicator angry
-

azzzertyy updated:

+

adamsong updated:

    -
  • Network admin now has rnd access
  • +
  • fixed mfa backup codes not working
-

warface1234455 updated:

+

cowbot92 updated:

    -
  • fix supermatter normal delam not working
  • +
  • Makes the deep fryer hungry, occsionally
  • +
  • fixed the faded eyepatch not giving you night vision despite it telling you it does
-

05 December 2023

-

cowbot92 updated:

+

27 January 2024

+

ktlwjec updated:

    -
  • Adds new alt-job titles to roboticists
  • +
  • Removes a line in the sith cloak sprite.
-

ninjanomnom, Ryll-Ryll, Bizzonium, KylerAce, Sinsinins, lessthnthree updated:

+ +

26 January 2024

+

Runian updated:

    -
  • Added new fonts and refactored runechat. Also some backend stuff it's fine.
  • +
  • Shooting a cyborg snack dispenser while in a zero gravity environment correctly starts moving you in the opposite direction that you shot it.
-

sapphicoverload, bluishtsunami updated:

+ +

23 January 2024

+

Moltijoe updated:

    -
  • adds a water gun to donksoft vending machines (and uplink)
  • -
  • preternis water damage tweaked to be more affected by smaller volumes
  • -
  • preternis water damage updates immediately when splashed instead of waiting up to 2 seconds
  • +
  • Fixes an issue with blood decals
-

04 December 2023

+

22 January 2024

Moltijoe updated:

    -
  • Pseudocider costs 8tc instead of 6tc
  • -
  • Pseudocider has a 30s cooldown instead of 20s
  • +
  • Added new maroon organ objective for traitors to roll
  • +
  • Traitor break machinery objective only requires breaking the original machines
  • +
  • Traitor break machinery targets at max 2 areas instead of up to 4
-

SapphicOverload updated:

+

Mqiib updated:

    -
  • electrical protection is now its own armor type
  • -
  • certain engineering equipment like hard hats and work boots now have electrical protection
  • -
  • spliced wires check electrical protection on your feet instead of your hands when you step on them
  • -
  • combat defib disarm takes electrical protection on targeted limb into account
  • -
  • lightning flow punches, combat defib disarm, and hacked cyborg hug module all check electrical protection on the targeted limb
  • -
  • touching hacked cyborg energy fields with your hand now actually checks protection on that hand
  • -
  • slightly reorganized the armor tags and adds electrical protection to the list
  • -
  • fixed nanites not being affected by electric shock because of a missing signal
  • -
  • fixed gloves and shoes with armor not actually protecting your hands and feet respectively
  • -
  • fixed power fist not working
  • +
  • Imperial jumpsuits don't have alt styles, stop trying to break the dress code soldier!
-

azzzertyy updated:

+

Yarinoi updated:

    -
  • Mediator is no longer roundstart.
  • +
  • 'Solo' special syndi-kit is now slightly more balanced. David. David you aren't going to let this stop you are you David. Get to work David ignore the EMPs. Take your pills get to work.
-

03 December 2023

-

cark updated:

-
    -
  • fixes missing floor in airlock on donut
  • -
-

itseasytosee, sapphicoverload updated:

+

21 January 2024

+

ktlwjec updated:

    -
  • some items and projectiles are now better or worse than others at destroying things
  • -
  • chat messages from hitting an object now tell whether you can damage it
  • -
  • fixed machines/structures/etc not caring about armor penetration when hit by a melee weapon
  • -
  • fixed cannonballs not doing any damage to mobs
  • +
  • Mammi and Pea Soup need bowls to craft.
-

Moltijoe updated:

+ +

20 January 2024

+

kugamo, warface1234455 updated:

    -
  • Sometimes fixes feed ability sometimes breaking
  • -
  • Gangrel transformation ability now shows the radial menu before the 10 second do_after
  • -
  • Fixes gangrel transformation ability sometimes deleting itself without ever being used
  • -
  • Fixes gangrel werewolf transformation being eradicated from the timeline by tattax
  • +
  • Resprites the Bluespace Harvester.
  • +
  • Also also slightly changes the nether portals event, so that the portals spawn sequentially over at most 15 seconds.
+ +

19 January 2024

SapphicOverload updated:

    -
  • fixed ED-209 not being affected by heavy EMPs
  • -
  • fixed leg implants not being affected by EMPs at all
  • -
  • fixed cybernetic ears causing longer knockdown times on light EMPs instead of the other way around
  • -
  • fixed nanite heart killing you instantly on EMP regardless of whether or not it kills your nanites
  • -
  • HoS gun now shoots ion carbine projectiles instead of its own redundant projectile type
  • -
  • mech ion cannon has 1.5x stronger EMPs than the ion rifle
  • -
  • syndicate EMP bomb has 2.5x stronger EMPs than standard EMP grenades
  • -
  • reworks EMPs to allow any severity, which now decreases with distance
  • +
  • added stairs to icemeta's mining base
  • +
  • added directional stairs icons
  • +
  • fixed regenerative cores having a delay on icemoon
- -

02 December 2023

-

Moltijoe updated:

+

warface1234455 updated:

    -
  • No more infinitely duplicating hulk DAN
  • -
  • Hulk now occasionally says the brain damage hulk lines
  • +
  • Fix invisible netmin wintercoat hood
  • +
  • Bring back Raven cruiser emergency shuttle
+ +

18 January 2024

SapphicOverload updated:

    -
  • fixed runtime error when passive vents encounter zero temperature or zero volume
  • -
  • fixed abandoned crates having a 2% chance to cause runtime errors when initialized
  • +
  • made the chat message from losing obsession more visible
  • +
  • you can now place items on the altar of the gods without having to climb on top of it
-

01 December 2023

-

Twaticus, Imaginos16, Cark updated:

-
    -
  • added new object sprite for plasteel tile
  • -
  • deleted old object sprite for plasteel tile
  • -
-

JohnFulpWillard updated:

-
    -
  • Stasis units and sleepers now have proper overlays and lavaland sleepers aren't invisible anymore.
  • -
-

Yarinoi updated:

+

17 January 2024

+

Loiosh42 updated:

    -
  • Pitying the miners attempting to look for it, the Demonic Frost Miner now gives out a Hollow Signal on GPS.
  • +
  • Adds an ignition_effect to the cautery.
-

azzzertyy updated:

+ +

15 January 2024

+

bruhlookatthisdood updated:

    -
  • You can now point while handcuffed
  • +
  • Waiting For The Sun (Rimworld OST) is in jukebox now

cowbot92 updated:

    -
  • Adds new bar signs
  • +
  • fixes decals
-

30 November 2023

-

ToasterBiome updated:

+

13 January 2024

+

SapphicOverload updated:

    -
  • Adds a new lavaland lava type that you can't replace with shelter
  • -
  • lavaland syndie base is surrounded by no-shelter lavaland lava
  • +
  • fixed chat not always showing up in replays
-

29 November 2023

-

Moltijoe updated:

-
    -
  • Brig physician also gets cloning and airlock access during skeleton crew
  • -
  • Paramedic also gets surgery access during skeleton crew
  • -
  • Mining medic also gets cloning, maint, and airlock access during skeleton crew
  • -
  • All hecata zombies die when the controlling bloodsucker dies
  • -
  • lightning flow no longer immobilizes for like 0.1 seconds every dash
  • -
  • Preterni no longer get 20% more power from liquid electricity than other powerhungry species
  • -
  • All powerhungry species now get "food" from consuming teslium, not just Preterni
  • -
-

Runian updated:

+

12 January 2024

+

SapphicOverload updated:

    -
  • Lizard tail users can *thump their tail.
  • -
  • Tail thump.
  • -
  • Guardian's Frenzy Ability now respects the three second cooldown that it is suppose to be limited by.
  • +
  • adds more winter coats
  • +
  • moves winter coat and hood sprites to their own files
-

ToasterBiome updated:

+

Therandomhoboo updated:

    -
  • Removes tile grime and support for it.
  • -
  • Replaces tiles to be less shiny.
  • +
  • Astrotame, bbq, sugar, cream & chocolate are now 10u's instead of 5.
  • +
  • Chocolate packets are now correctly called chocolate packets instead of Creamer....
-

ynot01 updated:

+

warface1234455 updated:

    -
  • Command channel is now blue once more
  • -
  • fixed pseudocider not duplicating headwear
  • +
  • FIx preset programs arent installed in pda/phone
-

28 November 2023

-

MajManatee updated:

+

11 January 2024

+

Runian updated:

    -
  • Horrors can now scan their hosts
  • -
  • Horror chemicals now say how much they inject
  • +
  • The description of ammo boxes now accurately show how much bullets are left when you use an ammo box on another ammo box.
-

Moltijoe updated:

+ +

10 January 2024

+

AMyriad updated:

    -
  • Only Delta alert gets red lights
  • -
  • Fixes an IAA bug involving pseudocider
  • -
  • adds a glowing outline to anyone with the holy light heal boost
  • -
  • fixed a bug where limb healing generated less favour than overall healing
  • -
  • Increases the holy light heal boost duration to 1 minute from 30 seconds
  • -
  • Reduces the amount of favour that holy light generates by 50%
  • -
  • Gives warden brig phys access during skeleton crew
  • -
  • Makes monster hunters monster hunting objective actually tell the monster hunter to hunt monsters
  • +
  • Dusted plasmamen now have plasma remains

Runian updated:

    -
  • Constructed anchored emitters are correctly recognized as wrenched; you no longer need to wrench these anchored emitters twice to make it work.
  • -
  • Flying Fang's damage-dealing disarms respects pacifism as intended.
  • -
-

SapphicOverload updated:

-
    -
  • fixed fire extinguishers not working if the particle never moves
  • +
  • Override Machine and Overload Machine abilities (from malf AI/malf upgrade disk) now work.
  • +
  • Nerve Grounding and other ways that change your physiology's siemens coeff properly protect you from getting electrocuted.
-

cowbot92 updated:

+

Scrambledeggs00 updated:

    -
  • Added new fruit
  • -
  • Added new drink to go with that fruit
  • -
  • added some icons and images for lantern fruits and drinks
  • +
  • Added a new thing to IceMeta
  • +
  • Sprites for the new thing
- -

27 November 2023

-

goober3, cark updated:

+

ToasterBiome updated:

    -
  • added some dirt linings
  • +
  • rating polls now work properly
  • +
  • Updates maintainer list and thanks more stations in our special thanks section
-

Moltijoe updated:

+

bruhlookatthisdood updated:

    -
  • Syndicate fedora can no longer be caught using throw mode
  • +
  • ASay and DSay are now no longer visible to non-admins
-

Mqiib updated:

+

wonderinghost updated:

    -
  • Lizard wings now use the new lizard colors instead of the slightly-off old colors
  • +
  • fixed my mistakes
  • +
  • makes the prior pr picture perfect
-

Runian updated:

+ +

09 January 2024

+

Aquizit updated:

    -
  • Ion storms can affect up to 20 airlocks and 10 APCs with random effects, only if is no AI.
  • -
  • Airlocks affected by ion storms will randomly have one of the following effects: toggle bolts, toggle emergency access, shock temporarily or have their safety & speed toggled.
  • -
  • APCs affected by ion storms will have one of three or all of their power channels turned off.
  • +
  • The innkeeper can now get stuff from their booze-o-matic and kitchen vending machines.
-

SapphicOverload updated:

+ +

08 January 2024

+

cark updated:

    -
  • preternis now purge 4% of internal chemicals every tick, instead of purging everything after 20 ticks
  • -
  • preternis are no longer immune to the effects of morphine and a few other chemicals
  • -
  • fixed unintended change to damage of every two-handed weapon
  • -
  • fixed runtime error when trying to use certain two-handed weapons with one hand
  • -
  • fixed preternis being affected by water through hardsuits
  • +
  • fixes some railings in bar
  • +
  • Reenables Icemoon Walkers
-

cowbot92 updated:

+

Therandomhoboo updated:

    -
  • Ports updated TG announcements & TGUI
  • +
  • Moonshine now makes you gain blurry, long live blurry vision
-

26 November 2023

-

Moltijoe updated:

+

05 January 2024

+

AMyriad updated:

    -
  • Battle royale loot distribution
  • +
  • Updated the storage implant's toggle sprite
-

SomeguyManperson updated:

+

EdgeLordExe updated:

    -
  • hallucination anomalies have had their effects altered. You many want to bring a toolbox instead of mesons when responding to one
  • -
  • hallucination reactive armor has had its effects modified similarly to the new effects of the anomaly
  • -
  • the supermatter will no longer spawn hallucination anomalies when exploding, on fire, or otherwise.
  • +
  • New Mining area: Jungleland, Most content added by Djiq, Most ruins, some mobs and Ivymen added by Marmio64. Other ruins added by ToasterBiome. Various fixes and updates by courtesy of Jamie1D and SapphicOverload!
  • +
  • New Mobs now appear on jungleland, such as Meduracha, Dryads, Giant mosquitoes, and Skin Twisters!
  • +
  • New Mining implement: Kinetic Javelin, get it either from the roundstart kit, or buy it in a mining vendor.
  • +
  • New Megafauna: Tar King - You can summon it by collecting 3 parts of a broken crystal, assembling it, and placing it in a Forgotten Altar!
  • +
  • Ivymen - Jungleland's counterpart to ashwalkers, by Marmio64
  • +
  • Jungleland has many new biomes, beware of sulphuric pits, as it will cause you trouble if you step into it.
  • +
  • Added new icons and icon states for jungleland
  • +
  • Added Jungleland as a new mining destination!
-

25 November 2023

-

Ghommie updated:

-
    -
  • Examining a human mob as an observer displays "Quirks", not "Traits"
  • -
-

JohnFulpWillard updated:

+

04 January 2024

+

ZephyrTFA, san7890 updated:

    -
  • Seclites now have directional lights- point them in the direction you want to see more of.
  • -
  • Ported over many refactors to lighting and opacity. Please report if you can walk or see through walls unintentionally.
  • +
  • fixed chat messages not showing up sometimes
-

Majkl-J updated:

+

Aquizit updated:

    -
  • Virology: New symptom, superficial healing
  • +
  • Removed disposals air alarm
  • +
  • Moved windoor in disposals
  • +
  • Scrubs a couple bad AI Ion Law things

Runian updated:

    -
  • Shooting plasma sheets with a damaging burn-based projectile ignites it.
  • +
  • The threshold description for symbiotic regeneration is now accurate.

SapphicOverload updated:

    -
  • added preference for non-upgraded cybernetic organs as quirk options
  • -
  • random cybernetic organ quirk costs 3 instead of 4
  • +
  • polysmorph tails slightly increase crawl speed
  • +
  • fixed printed IPCs having human names instead of IPC names
  • +
  • supermatter crystal and nuclear reactor are less unstable
  • +
  • footstep sounds actually work again
-

cowbot92 updated:

+

Therandomhoboo updated:

    -
  • Adds auxmos to the minor filter
  • +
  • Slurring now happens based on what kind of drinker you are (Light, normal or heavy drinker which are based on traits)
  • +
  • Slurring duration changed based on drinker type
  • +
  • The constant chance to randomly slur, we can drink now
-

23 November 2023

-

SapphicOverload updated:

-
    -
  • power-fist works like a glove now
  • -
-

SomeguyManperson updated:

-
    -
  • gangrel gorilla transformation is now 15 armor down from 40
  • -
-

Yarinoi updated:

-
    -
  • Medical can print chemical analyzer implants again.
  • -
-

warface1234455 updated:

+

03 January 2024

+

Cowbot92 & Molti updated:

    -
  • Remove the portable pump cargo pack
  • +
  • tweaks how blood works
  • +
  • adds new blood
  • +
  • removes the old bad blood
  • +
  • fear the old blood
-

ynot01 updated:

+

Moltijoe updated:

    -
  • The door between the armory and the auxiliary armory are now default security access
  • +
  • Ethereal eyes now give +1 view range
-

22 November 2023

-

PositiveEntropy, Cark, Blutsu updated:

-
    -
  • new wood sprites from TG, and resprites on stairs by Blutsu
  • -
  • replaces old wood tile sprites
  • -
-

cark updated:

-
    -
  • bridge on donut now has an APC and blast doors, apc in chapel is moved and some other minor fixes
  • -
-

00ze-cyclone updated:

-
    -
  • Removed helmet, bulletproof helmet and riot helmet crates
  • -
  • armor, bulletproof armor and riot armor crates now contain helmets as well, price adjusted to cost the same as before
  • -
-

JohnFulpWillard updated:

-
    -
  • Pancake overlays now work
  • -
+

29 December 2023

SapphicOverload updated:

    -
  • fixed people with the bald trait not being bald when cloned
  • -
-

Therandomhoboo updated:

-
    -
  • Glycerol making results in 3 units instead of 1
  • -
  • Reinforced Window Damage deflection is now 11 instead of 10
  • -
-

wonderinghost updated:

-
    -
  • Adds new programs and hardware to pdas
  • +
  • exosuits now have directional lights, with much longer range
- -

20 November 2023

-

Cowbot92 & ChubbyGummibear updated:

+

ToasterBiome updated:

    -
  • tweaks heretic TGUI
  • -
  • tweaks heretic blade's wound chance
  • +
  • Project Bee has a new sprite and description
-

Moltijoe updated:

+

jupyterkat updated:

    -
  • Fixes a bug where lightning flow disabled certain actions if a dash ended weirdly
  • -
  • Makes syndicate fedora and boomerang not super janky
  • -
  • Syndicate fedora has a longer click throw cd
  • -
  • Fixes extended shock touch not having a cooldown or sound effect
  • +
  • updated auxmos to latest
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index b4c9cd4cb552..d08bea6e0eba 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -43173,3 +43173,510 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - mapping: Removes arrival shuttle from NVS Gax, people spawn in cryo now cowbot92: - rscdel: Removed Yellow Jacket Matriarchs from the gold slime pool +2024-02-19: + SapphicOverload: + - bugfix: RCDs work on space tiles again + - bugfix: Fixed space lighting not working in space +2024-02-20: + Chubbygummibear: + - bugfix: fix adminwho by skipping null clients in the admin list + cowbot92: + - bugfix: fixed beartraps not trapping + warface1234455: + - bugfix: cable coil maxstacks is now 40 +2024-02-21: + ' Identification': + - imageadd: Restores walls to true top-down. + ' sapphicoverload, syncit21, zxaber': + - rscadd: added a bunch more equipment for utility mechs + - soundadd: adds new sound effects for hydraulic clamp and APLU mech movement + - tweak: hydraulic clamp works as a wrench or crowbar and can pry powered doors + - tweak: mech plasma cutter can be used as a welder like the handheld version + - tweak: mech RCD works like an actual RCD now + - tweak: adds tgui RCD menu + - tweak: strafe button icon shows whether or not you're strafing + - tweak: APLU and Clarke mechs now have radiation shielding + - bugfix: fixed clarke movement not working correctly + - bugfix: fixes and re-adds multi-Z mech movement (no phasing through floors or + teleporting to other z-levels this time) + 13spacemen: + - tweak: The latejoin menu no longer has anemia. + AMyriad: + - bugfix: Fixed the eye of god expose cooldown going off when an invalid target + is selected + - spellcheck: Fixed mention of Weyland-Yutani appearing in the ripley mech repair + manual + - tweak: '"Hyperspace" no longer exists and never did, FTL travel is achieved by + tunneling through bluespace' + - bugfix: Players can no longer relabel gas canisters to a variant that's intended + for admins and breaks the 4th wall + Chubbygummibear: + - bugfix: index_out_of_bounds fixed on blend_cutoff_colors + - bugfix: turfs that smooth will spur their neighboring turfs to check their smoothing + again when late loaded in + - bugfix: cables on the correct plane so they don't have weird lattice lighting + filters + - bugfix: meteors with space lighting overlays rotate with the meteors instead of + being disjointed and unmoving + - bugfix: shuttle atmos shouldn't get left behind on takeoff + LazennG: + - bugfix: fixed seismic suplex animation and some text + adamsong: + - bugfix: fixed shuttle catastrophe + - bugfix: fixed admin shuttle manipulator + cowbot92: + - tweak: adjust some pop requirements for several antags + redmoogle: + - rscadd: PC Range Upgrade + - rscadd: PC Cooldown Upgrade + - bugfix: Vending machines not containing upgrades + - tweak: All plasma cutters can be upgraded + - tweak: Plasmacutters can be recharged with one click now + warface1234455: + - tweak: Partially revert undocumented change to shutter/blastdoor layer covering + window but still keep the blast door covering the door +2024-02-23: + ' Cowbot92 & Chubbygummibear': + - bugfix: Fixes a bunch of stuff you step on + - rscadd: Added new traitor item, the gasharpoon + Chubbygummibear: + - rscadd: auto_profile config flag added to the private default and private server + config files + - tweak: private servers aren't dumpy unless you specifically request them to be + - tweak: main yog server will be extra dumpy because we can handle it + - bugfix: no more double clerk and chaplain workplace spawns + Moltijoe: + - imageadd: New ethereal bodyparts + - imagedel: Old ethereal bodyparts +2024-02-24: + ' ktlwjec': + - imageadd: Lightens the outline for the bag of holding in-hand sprites. + 13spacemen: + - rscadd: Footprints are now based on what shoes you're wearing and what legs you + have + - bugfix: Fixed bloody item overlays leaking onto other objects + AMyriad: + - spellcheck: Fixed every description that didn't begin with a capital letter, make + a bug report if you find something I missed + - tweak: MMIs and positronic brains can no longer be printed from the medical techfab + Mqiib: + - tweak: The clarke is now tied for fastest mech in the game with the ripley mk-I + - tweak: Mech melee weapons now also hit vines properly when using cleave attacks + SapphicOverload: + - tweak: flamethrowers now react their fuel for damage and effects instead of using + pre-determined values + - tweak: flamethrower tanks release some of their contents when shot instead of + just deleting themselves + - tweak: flamethrowers can hit vines on windows + - bugfix: fixed flamethrowers sometimes using more fuel than intended + cowbot92: + - rscadd: ' Ports baton light up from TG' + warface1234455: + - tweak: HFR gas byproducts now uses scaled_production instead of fuel_consumption, + and now scaled alongside with gas produced from moderator, code refactor +2024-02-25: + ' Cowbot92 & Chubbigummybear': + - bugfix: fixes most floor stuff you walk over not working + ' cark': + - rscadd: Added a new disease which turns you into a crab + AMyriad: + - mapping: Removed all old PDA cartridges from all lockers, vendors, and tables + on all stations excluding the clerk's gift vendor + - spellcheck: Revised the flavor text on old PDAs to reflect their status as outdated, + "antique" pieces of equipment + - mapping: Replaced the old ID console from the CE's office on icemeta with the + newer modular console + Marmio64: + - rscadd: Adds the Den of Sin, a jungleland casino run by a demon. + Moltijoe: + - bugfix: No more zombies in xenobio + - rscadd: Preternis eyes glow purple when nightvision is active + - tweak: Battle royale + - rscadd: Certain species bodyparts now glow in the dark + - rscadd: Adds S.E.L.F. ipcs and S.E.L.F. insurgents + - rscdel: Synths and Military synths + - rscdel: Syndicate bounties + - rscdel: Lights no longer start off except for empty departments + - tweak: adds a cooldown to light flickering from explosions/etc + - bugfix: Skittish now works properly for crates + SapphicOverload: + - rscadd: Added a unit test for fusion reactions + - bugfix: Fixed fusion reactions not working in the atmospherics simulator computer + - bugfix: Fixed hydraulic clamp not being able to pick up lockers or deconstruct + tables + - tweak: Ripley MK-II and Firefighter have been merged into the same mech + Yarinoi: + - imageadd: added new chaplain hat icons + - imagedel: 'removed old chaplain hat icons :exploding_head:' + warface1234455: + - tweak: Raise the HFR's healium healing threshold from 66.66% to 90%. + - bugfix: Fix apc building and unnable to change electric armor value from VV + - rscadd: Add pluoxium + antinoblium gas recipe to HFR + - bugfix: fix tier 2 moderator pluonium production output on tgui +2024-02-26: + Moltijoe: + - bugfix: Traitors can no longer roll whiteship or freeminer machines for the destroy + objective + Mqiib: + - bugfix: Undoes accidental revert pertaining to bloody footprints + cowbot92: + - rscdel: Removed mindreading + - tweak: tweaked cerebral neuroplasticity gene + redmoogle: + - tweak: Examining cutter mods shows you cost and stackability +2024-02-27: + ' axietheaxolotl': + - rscadd: Added pride pins + 13spacemen: + - bugfix: Humans have shoe footprints again + Moltijoe: + - bugfix: Fixes being unable to place items in closets or crates + - bugfix: Miners and mining medics now properly cause the mining base to start with + the lights on + - bugfix: Fixes bugs with blood type compatibility + - bugfix: venus human trap bulb vines properly get destroyed when the bulb is + - bugfix: fixes a bug where emissive bodyparts showed as white in the character + menu + Mqiib: + - rscadd: Adds the new Black Mamba for nuclear operatives to play with + - rscadd: Adds two new venom-related weapons for the Mamba + SapphicOverload: + - bugfix: Fixed clothes that don't cover your hands protecting your hands from electric + shock + adamsong: + - bugfix: fixed info command showing numerical security levels +2024-02-28: + 13spacemen: + - rscadd: Mimes get their own special survival boxes + - bugfix: Plasmaman clowns will properly get their plasma tank in their hugbox +2024-02-29: + ' ktlwjec': + - tweak: Meatballs in ingredient boxes start off raw. + AMyriad: + - mapping: Added a second button to the kitchen on Box to toggle counter shutters + - mapping: The privacy shutters in the kitchen on Box are now toggled with the bottom + (already existing) button + - mapping: Removed the third blender from the kitchen on Box + - mapping: Fixed every fire alarm that was facing the wrong direction on Box + - mapping: Fixed a mountain of decals using the wrong colors on every map + - mapping: Asteroid maint doors now have clear hazard stripes instead of nearly + invisible brown ones + - mapping: Changed a few bridge decals to look better on every map + - mapping: Gax telecomms is now color coded, now has nice engie decals in the net + admin's office + Moltijoe: + - tweak: New sandevistan visual effect + - tweak: Weedkiller does 2x damage to venus human traps than before + - tweak: Venus human traps can no longer pull + - tweak: venus human traps now require a pressurized environment + - bugfix: Fixes surgical toolset arm implant visuals + - bugfix: Fixes being unable to select a clan as bloodsucker + - tweak: Preternis eyes now also care about if a species is powerhungry instead + of only robotic + - tweak: Preternis eyes night vision now consumes power from powerhungry species + - tweak: Preternis eyes only take damage in non powerhungry species when nightvision + is turned on + - bugfix: Powered ruins properly start with lights on if they have a lightswitch + - rscadd: Wizards can now cast iron + - rscadd: Lets hecata necromancy poll ghosts into mindless corpses + - rscadd: Lets admins force a specific bloodsucker clan on people + Mqiib: + - bugfix: Light step now stops your shoes from getting dirty again + SapphicOverload: + - bugfix: Goliath hide plates can be attached to APLU mechs again + ToasterBiome: + - bugfix: quirks won't delete themselves from your characters if you load in fast + anymore + cowbot92: + - rscadd: 'Added new smite: wibblify' + warface1234455: + - tweak: You can now go through atmos resin with slowdown. + - tweak: Changed resin description + wonderinghost: + - tweak: updates max byond version to .1640 +2024-03-01: + AMyriad: + - mapping: Patients can now exit from both left and right doors on Box medbay + MajManatee: + - rscadd: New hugboxed donk-soft vendor for roundstart. Cant load riot darts. +2024-03-02: + AMyriad: + - mapping: Adjusted decals and added some spooky flooring to the curator's backroom + in the library on Box + - mapping: Fixed a misplaced decal +2024-03-03: + JamieD1: + - rscadd: Added new Title Screens from 2024 Contest + Moltijoe: + - bugfix: Properly updates special eye colour upon insert and removal +2024-03-04: + ' cark': + - mapping: fixes an issue where psychiatrist on donut didnt have a spawnpoint + SapphicOverload: + - tweak: walls are now destructible + Scrambledeggs00: + - bugfix: Fixes book modification + - spellcheck: Changes the wording of some book modification prompts +2024-03-05: + 13spacemen: + - tweak: Human unarmed attack visual effects are based on species instead of the + attack verb text + N3D6: + - mapping: adds an extra smes unit to donut engi, adds light switches and extra + closets to donut engi +2024-03-06: + 13spacemen: + - tweak: Chat no longer complains if you have unbound keys +2024-03-07: + warface1234455: + - tweak: Blob now generate research points if inside a containment field + - tweak: Shuttle will leave when blob is contained inside a containment field + - tweak: Supermatter blob delam now create blob without ghost poll (you can still + click the blob camera to enter the blob if ur not banned or the blob is not + occupied by another ghost) +2024-03-08: + ' Identification': + - imageadd: Adds a sprite for ColtonOps, you will know it when you see it. + 13spacemen: + - rscadd: Moths, Phytosians, Abductors, Plasmamen, IPCs, Jelly/Slimepeople, Felinids, + Polysmorph, all have their own butt sprites + JamieD1: + - tweak: Changes Hub Text + LazennG: + - bugfix: added proximity check to suplex + - tweak: seismic arm suplex bonus damage vs charging bubblegum + Moltijoe: + - bugfix: Fixes a runtime that allows infinite duping of possessed sword nullrods + - rscadd: Adds new wizard spell, scrunch + - bugfix: Fixes a bug where mood wasn't properly forced for everyone + Runian: + - rscadd: Only obtainable via a camera laser upgrade disk (or by being a traitor), + the AI can get an ability based around lasers and their cameras. + - rscadd: This new AI ability lets them enter a burst mode which lets them shoot + a laser from any functioning camera every second. It lasts for 30 seconds and + be re-activated every 60 seconds. Cameras used in this matter are hit with a + heavy EMP. + - bugfix: Hitting an AI control console with an upgrade no longer runtimes. + - spellcheck: Logging regarding upgrading the AI with disks has better formatting. + SapphicOverload: + - tweak: Liquid plasma tiles cool down gas in radiator loops instead of heating + them + Scrambledeggs00: + - rscadd: Adds the flagellant's chains to chaplain's armament beacon + - imageadd: Adds sprites for the flagellant's chains + Therandomhoboo: + - bugfix: Drunken Resilience back into the fray + - rscadd: Drunk Level 81 & Drunk Level 101 giving heals + - tweak: Drunk Resilience no longer is culmative healing + warface1234455: + - tweak: Healium now heals oxy damage +2024-03-10: + N3D6: + - mapping: cleans up some decals on meta + - mapping: makes teg console recognize injector and replaces the scrubber with a + vent pump + - mapping: replaces airlock controllers on meta teg with lavaland airlock controllers, + should fix taking pressure damage +2024-03-11: + LoliconSlayer: + - tweak: tweaked the elder atmosian statue's description +2024-03-12: + ' Am37000 & Molti': + - rscadd: Added new hawaiian themed items + - imageadd: addedsprites for hawaiian themed items + ' ktlwjec': + - bugfix: The pin for the pocket fire extinguisher in-hand sprites are correct. + AMyriad: + - bugfix: Fixed being able to enter centcom via disposals + - tweak: Skin twister health reduced from 320 -> 285 + Chubbygummibear: + - bugfix: Box Chapel tiles had no plating under them so crow barring them would + send you straight to god + - bugfix: Broken grille sprites back. They just wanted to grille for Pete's sake + - tweak: Organized the spaghetti layering of atmos pipes, disposal pipes, and cables. + Mqiib: + - tweak: Lizards, polysmorphs, and skeletons now actually make claw noises like + everyone always said they did. This also indirectly makes them louder. + cowbot92: + - rscadd: Added Sec Plasmaman stuff to the SecDrobe +2024-03-13: + AMyriad: + - rscadd: CentCom inspectors and clown ops now have their own PDA presets + - tweak: CentCom inspectors, contractor supports, chameleon kits, etc. no longer + spawn with old PDAs - now have modern ones + - spellcheck: Changed nukie PDA flavor text + - imageadd: Button frames now have a proper sprite + Moltijoe: + - tweak: Reduces the chance for rare and joke title screens + N3D6: + - tweak: rcd ore silo upgrade research price 2500 from 25000 + ToasterBiome: + - bugfix: jaunters activate automatically in non-belt slots again + - bugfix: bad mail wont stop shuttle anymore +2024-03-14: + Chubbygummibear: + - bugfix: simple mobs call update_appearance on death which will update overlays + applied to them + Moltijoe: + - bugfix: Makes the night vision quirk work again + - tweak: Joe the goliath no longer resists being pulled + N3D6: + - tweak: tweaks meta engine weights to 45/30/25 sm, reactor, teg + SapphicOverload: + - bugfix: Crew monitoring and tracking works in multi-z + - bugfix: Radio messages work across connected z-levels + YashinHak: + - rscadd: moar pins mostly meme ones but also the gay one + - tweak: pins are now smaller + - imageadd: new pin icons (obj + mob) + - imagedel: old pin obj icons +2024-03-15: + SapphicOverload: + - bugfix: fixed chasms killing you if there's an available z-level below + ToasterBiome: + - bugfix: job occupations won't delete themselves and you won't be put into random + jobs if you haven't loaded your character + - bugfix: mining points card says the correct description + - bugfix: scars check for the correct body part flag instead of the body part itself + cowbot92: + - tweak: adjusts the minor filter +2024-03-16: + ' cark': + - mapping: fixes a couple mapping errors on box + AMyriad: + - bugfix: Fixed NanoMed using the wrong sprite + - imagedel: Deleted TG's ChemVend and NanoMed sprites after being left over from + another PR + Moltijoe: + - tweak: Tweak mining medic jackets to have comparable armour to an unupgraded explorer + suit + - bugfix: Fixes a bug where maroon organ objective wouldn't mulligan properly + - bugfix: fixes mining medic jumpsuit from having 5 less wound armour than every + other basic jumpsuit + - bugfix: brig phys now spawns with the brig phys jumpsuit rather than the mining + medic one + - tweak: gives mining medic jumpsuit the same armour as miner's jumpsuit + - tweak: Gives a 30% chance for traitors to get another objective instead of being + told to escape + - bugfix: Fixes a couple issues with hawaiian stuff + - tweak: Reworks the cursed ice hiking boots + - tweak: Tweaks mood to have significantly less negatives and REALLY minor positives + - experiment: This is experimental + - bugfix: Fixes a bug with the dryad crusher trophy + N3D6: + - mapping: adds a missing decal to icemeta + ToasterBiome: + - rscadd: Adds a new NVS Gax poster + cark: + - mapping: adds colton statue to the CC testing chamber + tattax: + - rscadd: admins can change colors on a specific item if it uses the GAGS system + - rscadd: you can now use right click -> toggle flashlight to toggle PDA flashlight + - imageadd: changed some sprites to use GAGS +2024-03-17: + Chubbygummibear: + - bugfix: casino slot machines visible again + - rscadd: You can "Bash" on windows by harm intent clicking them with an open hand + for a louder audio queue. + - bugfix: Paperframe window sprites were invisible + - soundadd: glassbash.ogg from TG + Moltijoe: + - bugfix: Maybe fixes a bug with disposal pipes qdeleting people + warface1234455: + - bugfix: fix decal being transparent when applied with decal painter +2024-03-18: + AMyriad: + - bugfix: Fixed invincible carpets looking like a black void (see goat king's arena) + - bugfix: Fixed cog grilles looking like smiling tables + - bugfix: Fixed cargo shuttle blast doors not opening properly + - bugfix: Fixed regenerative cerulean's second extract getting a null description + Aquizit: + - mapping: Adjusts and adds vents and scrubbers in Atmos Pumping Room + Chubbygummibear: + - rscdel: Ai-detecting multi-tool cannot show you blind spots anymore due to the + rendering rework. Rip to a real one + - bugfix: Ai cam location is visible to ghosts again and other entities that should + be able to see it + Yarinoi: + - tweak: hulk no longer screams over radio + enkidienne: + - rscadd: added lava fishing. + tattax: + - bugfix: prison jumpsuit shows up again +2024-03-19: + ' cark': + - mapping: fixes some issues on donut +2024-03-20: + AMyriad: + - bugfix: Fixed meatspike frames not checking if they're anchored or not when finishing + - bugfix: Fixed bamboo walls and floors looking like a black void + - bugfix: Fixed the pirate data siphon going invisible when activated + - bugfix: Fixed nuke op's telecomms machine being invisible + - mapping: Fixed two xeno spawn locations being in public areas + Aquizit: + - bugfix: Gave armory cameras on box and gax c_tags +2024-03-21: + tattax: + - bugfix: fixed missing sprite on booth circuitboard + - imageadd: reduced saturation on med and engie circuitobards + - bugfix: fixed wirecutter blood sprites + - bugfix: fixed some messed up screwdriver and wirecutter sprites +2024-03-22: + AMyriad: + - bugfix: Fixed a lot of engineering doors having incorrect access requirements + - tweak: Curators may now only go as far as where the protolathe is in engineering + - mapping: The Tar King's arena has been completely redesigned! Go check it out + Cartlord: + - rscadd: The Service Hall now has its own access type, which Heads of personnel + can add or remove as they see fit. + - rscadd: Artists now have Service Hall access. + - mapping: Hydroponics on IceMeta can no longer be accessed by Chefs without skeleton + crew being active. +2024-03-23: + AMyriad: + - bugfix: Fixed PDA screens being one pixel more to the left than they should be + - bugfix: Fixed water cookies tasting like /datum/reagent/water and metallic cookies + tasting like /datum/reagent/copper + - bugfix: Fixed cherry bulbs disappearing when ready to harvest + ToasterBiome: + - bugfix: Cargo shuttle call displays the correct time + - rscadd: sound now travels through z levels if they are onnected + - bugfix: quirks should finally stop resetting for real, along with your jobs since + your character is loaded properly. +2024-03-24: + Moltijoe: + - bugfix: Fixes laptop screen overlays appearing while the laptop is closed + - tweak: adds a 20 pop req to sleeping carp (doesn't require readied up like gamemodes + do) + SapphicOverload: + - rscadd: some weapons can now swing in an arc when using harm intent + tattax: + - bugfix: fixed canisters not laying on their side and showing the correct side + when broken + - bugfix: fixed error on toolbelt sprite +2024-03-25: + Moltijoe: + - tweak: Traitor Vampire gamemode can now roll during lowpop + - tweak: Traitor Vampire now spawns less traitors to make up for the vampires it + spawns + - bugfix: Fixes a typo in coffepack code that made them function like regular boxes + redmoogle: + - tweak: Mice have darkvision again + - tweak: Lipid extractor can no longer extract robots + - bugfix: Smart mines work again + - bugfix: Hilberts hotel works again + - mapping: Mapping Icon! + - bugfix: Shocked vending machines no longer spark when you walk away + - bugfix: You can no longer take RDS as a robotic species +2024-03-27: + AMyriad: + - mapping: Fixed an issue where prisoners/warden couldn't access the top fridge + in perma on Asteroid + - mapping: Fixed two misplaced firelocks in Box service maintenance + Moltijoe: + - bugfix: Fixes a bug where the break machinery objective wouldn't complete until + deleted objects went through garbage collection + redmoogle: + - bugfix: Mice cheese powers last more than 1 nanosecond + - tweak: Filing cabinets can accept tape now + - bugfix: Chasms no longer cause wounds diff --git a/html/mapping.png b/html/mapping.png new file mode 100644 index 000000000000..72e835d36b9e Binary files /dev/null and b/html/mapping.png differ diff --git a/icons/ass/assalien.png b/icons/ass/assalien.png deleted file mode 100644 index d7586f3b5ffd..000000000000 Binary files a/icons/ass/assalien.png and /dev/null differ diff --git a/icons/ass/asscat.png b/icons/ass/asscat.png deleted file mode 100644 index e37788e3dd73..000000000000 Binary files a/icons/ass/asscat.png and /dev/null differ diff --git a/icons/ass/assdrone.png b/icons/ass/assdrone.png deleted file mode 100644 index 748d207ff932..000000000000 Binary files a/icons/ass/assdrone.png and /dev/null differ diff --git a/icons/ass/assfemale.png b/icons/ass/assfemale.png deleted file mode 100644 index 4c941a9281d7..000000000000 Binary files a/icons/ass/assfemale.png and /dev/null differ diff --git a/icons/ass/assmale.png b/icons/ass/assmale.png deleted file mode 100644 index c6091cf19154..000000000000 Binary files a/icons/ass/assmale.png and /dev/null differ diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi index fc3e1ff515c5..eb36ab84fd1e 100644 Binary files a/icons/effects/64x64.dmi and b/icons/effects/64x64.dmi differ diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi index d7e81d7c86c2..8e4bd9e87d9a 100644 Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index fbe6182716b7..9f06f421b549 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 432ef8861cfb..483ab0444233 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi index a98344abe41e..29fdbe8eb0dd 100644 Binary files a/icons/effects/footprints.dmi and b/icons/effects/footprints.dmi differ diff --git a/icons/materials/composite.dmi b/icons/materials/composite.dmi new file mode 100644 index 000000000000..7bb2d4717887 Binary files /dev/null and b/icons/materials/composite.dmi differ diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi index 61d03cedaf79..b282e003376b 100644 Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ diff --git a/icons/mecha/mecha_ammo.dmi b/icons/mecha/mecha_ammo.dmi index 21e788225770..4257ee664e43 100644 Binary files a/icons/mecha/mecha_ammo.dmi and b/icons/mecha/mecha_ammo.dmi differ diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index e64729a33764..da6934255d3b 100644 Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ diff --git a/icons/mob/actions/actions_arm.dmi b/icons/mob/actions/actions_arm.dmi index 71bb415e8ad9..2154e742819e 100644 Binary files a/icons/mob/actions/actions_arm.dmi and b/icons/mob/actions/actions_arm.dmi differ diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index 380c03b64db3..efa30d1a998f 100644 Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi index 81c706b22c8a..78a2ba5ec89a 100644 Binary files a/icons/mob/actions/actions_mecha.dmi and b/icons/mob/actions/actions_mecha.dmi differ diff --git a/icons/mob/broadMobs.dmi b/icons/mob/broadMobs.dmi index a02cc7b40eba..fbd0b3dc0eba 100644 Binary files a/icons/mob/broadMobs.dmi and b/icons/mob/broadMobs.dmi differ diff --git a/icons/mob/butts.dmi b/icons/mob/butts.dmi new file mode 100644 index 000000000000..ae4b41961a1c Binary files /dev/null and b/icons/mob/butts.dmi differ diff --git a/icons/mob/carp.dmi b/icons/mob/carp.dmi index 5b6138ee99a4..e06d43632dbc 100644 Binary files a/icons/mob/carp.dmi and b/icons/mob/carp.dmi differ diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi index 03d7097a5665..9341c981bc02 100644 Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ diff --git a/icons/mob/clothing/feet/feet.dmi b/icons/mob/clothing/feet/feet.dmi index 419bf0662a6a..b6a4e7dc80fd 100644 Binary files a/icons/mob/clothing/feet/feet.dmi and b/icons/mob/clothing/feet/feet.dmi differ diff --git a/icons/mob/clothing/hands/hands.dmi b/icons/mob/clothing/hands/hands.dmi index 57bef8c67fff..e07cfff4b117 100644 Binary files a/icons/mob/clothing/hands/hands.dmi and b/icons/mob/clothing/hands/hands.dmi differ diff --git a/icons/mob/clothing/head/head.dmi b/icons/mob/clothing/head/head.dmi index a43e34bcaaa5..fb64585b16e2 100644 Binary files a/icons/mob/clothing/head/head.dmi and b/icons/mob/clothing/head/head.dmi differ diff --git a/icons/mob/clothing/suit/suit.dmi b/icons/mob/clothing/suit/suit.dmi index ac8c422c19db..184d25b111b4 100644 Binary files a/icons/mob/clothing/suit/suit.dmi and b/icons/mob/clothing/suit/suit.dmi differ diff --git a/icons/mob/clothing/uniform/color.dmi b/icons/mob/clothing/uniform/color.dmi new file mode 100644 index 000000000000..9b06725cbba7 Binary files /dev/null and b/icons/mob/clothing/uniform/color.dmi differ diff --git a/icons/mob/clothing/uniform/digitigrade.dmi b/icons/mob/clothing/uniform/digitigrade.dmi new file mode 100644 index 000000000000..262a3a6ef5b9 Binary files /dev/null and b/icons/mob/clothing/uniform/digitigrade.dmi differ diff --git a/icons/mob/clothing/uniform/uniform.dmi b/icons/mob/clothing/uniform/uniform.dmi index 9fa35b94b8f3..519caf8bab22 100644 Binary files a/icons/mob/clothing/uniform/uniform.dmi and b/icons/mob/clothing/uniform/uniform.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 6f626fe09f85..3731e47bd1c8 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 004bf8ad9902..a7e311e3a225 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/clothing/shoes_lefthand.dmi b/icons/mob/inhands/clothing/shoes_lefthand.dmi new file mode 100644 index 000000000000..a5fd6d3318cf Binary files /dev/null and b/icons/mob/inhands/clothing/shoes_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/shoes_righthand.dmi b/icons/mob/inhands/clothing/shoes_righthand.dmi new file mode 100644 index 000000000000..8f5a3c374ca0 Binary files /dev/null and b/icons/mob/inhands/clothing/shoes_righthand.dmi differ diff --git a/icons/mob/inhands/clothing/suits_lefthand.dmi b/icons/mob/inhands/clothing/suits_lefthand.dmi new file mode 100644 index 000000000000..fa5710999c01 Binary files /dev/null and b/icons/mob/inhands/clothing/suits_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/suits_righthand.dmi b/icons/mob/inhands/clothing/suits_righthand.dmi new file mode 100644 index 000000000000..125bd7d31880 Binary files /dev/null and b/icons/mob/inhands/clothing/suits_righthand.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 1ebfa63e995f..dc91db1cee3a 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index f68dba6e9fb7..907f4139ca43 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi index 15425dabca14..0183ae173468 100644 Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi index c51285f0867f..94b50fbb8d63 100644 Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index 9ad00aa5bd76..c712bd6c6fd8 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 9dc0437d76cf..d8e2ff8680a8 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index 63624745e62c..dd0e7cfc86b0 100644 Binary files a/icons/mob/inhands/weapons/melee_lefthand.dmi and b/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi index d50eb8ccea9d..6b66977d77a0 100644 Binary files a/icons/mob/inhands/weapons/melee_righthand.dmi and b/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/icons/mob/large-worn-icons/64x64/feet.dmi b/icons/mob/large-worn-icons/64x64/feet.dmi new file mode 100644 index 000000000000..a61eac554937 Binary files /dev/null and b/icons/mob/large-worn-icons/64x64/feet.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index f6bf7d3f1319..6b6e9542fb9e 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index 533e11521d65..9006b42b0700 100644 Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 151d24c214c0..7f5803efd00c 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/obj/3x3.dmi b/icons/obj/3x3.dmi index 07a0213aa937..ee6e36bca0b8 100644 Binary files a/icons/obj/3x3.dmi and b/icons/obj/3x3.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index e227028cb686..4eff54131ec2 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/atmospherics/canister.dmi b/icons/obj/atmospherics/canister.dmi deleted file mode 100644 index 761370ee112f..000000000000 Binary files a/icons/obj/atmospherics/canister.dmi and /dev/null differ diff --git a/icons/obj/atmospherics/canisters.dmi b/icons/obj/atmospherics/canisters.dmi new file mode 100644 index 000000000000..9e18e78b5875 Binary files /dev/null and b/icons/obj/atmospherics/canisters.dmi differ diff --git a/icons/obj/atmospherics/prototype_canister.dmi b/icons/obj/atmospherics/prototype_canister.dmi new file mode 100644 index 000000000000..fb73aa2ed6d2 Binary files /dev/null and b/icons/obj/atmospherics/prototype_canister.dmi differ diff --git a/icons/obj/atmospherics/stationary_canisters.dmi b/icons/obj/atmospherics/stationary_canisters.dmi new file mode 100644 index 000000000000..4f87a50845b0 Binary files /dev/null and b/icons/obj/atmospherics/stationary_canisters.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index 0f588ad01b4c..e6bb2b724a45 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index 9ecdbf6f3511..ae0fd1f8a7c0 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/hats/hats.dmi b/icons/obj/clothing/hats/hats.dmi index 38329a78dc60..8c15a42aef03 100644 Binary files a/icons/obj/clothing/hats/hats.dmi and b/icons/obj/clothing/hats/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index cc8fb14c949d..2d1ab1d4076a 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/sombrero.dmi b/icons/obj/clothing/sombrero.dmi new file mode 100644 index 000000000000..b072bf65d46c Binary files /dev/null and b/icons/obj/clothing/sombrero.dmi differ diff --git a/icons/obj/clothing/suits/suits.dmi b/icons/obj/clothing/suits/suits.dmi index 9e3b9be7ff5a..44742549c464 100644 Binary files a/icons/obj/clothing/suits/suits.dmi and b/icons/obj/clothing/suits/suits.dmi differ diff --git a/icons/obj/clothing/under/color.dmi b/icons/obj/clothing/under/color.dmi new file mode 100644 index 000000000000..7fac6b2cd8c2 Binary files /dev/null and b/icons/obj/clothing/under/color.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 7b37fce3408f..fd57bf712485 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index f58c661468a4..36e120bfac75 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index bb0f060df263..2e4f8c092751 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 8af620b9d4b5..310033272db2 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi index ea88c770277c..fff6d0578aa7 100644 Binary files a/icons/obj/food/soupsalad.dmi and b/icons/obj/food/soupsalad.dmi differ diff --git a/icons/obj/frame.dmi b/icons/obj/frame.dmi index 4f61df487064..6b9f614d8105 100644 Binary files a/icons/obj/frame.dmi and b/icons/obj/frame.dmi differ diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi index 94bb606cbfc5..7ae2646ec3b8 100644 Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi index 58802d672cb5..8a0fc079d28d 100644 Binary files a/icons/obj/hydroponics/growing_fruits.dmi and b/icons/obj/hydroponics/growing_fruits.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 106e8724a364..e6b8c3031218 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index f707bb375d0e..74511acb53ea 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/improvised.dmi b/icons/obj/improvised.dmi index 34e0c33a56b8..a86e0adc3e25 100644 Binary files a/icons/obj/improvised.dmi and b/icons/obj/improvised.dmi differ diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index 494c964d48f2..00d590b2ac43 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/icons/obj/machines/lithography.dmi b/icons/obj/machines/lithography.dmi new file mode 100644 index 000000000000..bdc433b0cb98 Binary files /dev/null and b/icons/obj/machines/lithography.dmi differ diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index f102d1f285fd..c6351744438a 100644 Binary files a/icons/obj/machines/telecomms.dmi and b/icons/obj/machines/telecomms.dmi differ diff --git a/icons/obj/modular_pda.dmi b/icons/obj/modular_pda.dmi index 868a5bf6e666..7ae61a241bbd 100644 Binary files a/icons/obj/modular_pda.dmi and b/icons/obj/modular_pda.dmi differ diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index 80fcbe6c6184..0f546d2f09c6 100644 Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ diff --git a/icons/obj/networking_machine.dmi b/icons/obj/networking_machine.dmi new file mode 100644 index 000000000000..e803d1d15aba Binary files /dev/null and b/icons/obj/networking_machine.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 6d12af0bd357..605f4e3d5dfe 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 505e934fb411..60e091811ace 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index bd97442a1b4f..f050f11da77a 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi index 12c051c0d837..16ca47c2aeb5 100644 Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index e772caff0077..6e80f9d97e95 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/traitor.dmi b/icons/obj/traitor.dmi index 92851f3708cd..4d7a4931bcaf 100644 Binary files a/icons/obj/traitor.dmi and b/icons/obj/traitor.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index a5db6caa6e2b..68ee93459785 100644 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/turf/walls/false_walls.dmi b/icons/turf/walls/false_walls.dmi index 1b02b4bdbe6d..a64fbe06fa5b 100644 Binary files a/icons/turf/walls/false_walls.dmi and b/icons/turf/walls/false_walls.dmi differ diff --git a/icons/turf/walls/material_wall.dmi b/icons/turf/walls/material_wall.dmi index 2bd844c0b135..d4c48e66f6ea 100644 Binary files a/icons/turf/walls/material_wall.dmi and b/icons/turf/walls/material_wall.dmi differ diff --git a/icons/turf/walls/material_wall.png b/icons/turf/walls/material_wall.png index 1f636cb6db09..0c2533dec6f9 100644 Binary files a/icons/turf/walls/material_wall.png and b/icons/turf/walls/material_wall.png differ diff --git a/icons/turf/walls/reinforced_states.dmi b/icons/turf/walls/reinforced_states.dmi index 89c0114a8d6e..4fc5c06e05a9 100644 Binary files a/icons/turf/walls/reinforced_states.dmi and b/icons/turf/walls/reinforced_states.dmi differ diff --git a/icons/turf/walls/reinforced_wall.dmi b/icons/turf/walls/reinforced_wall.dmi index 65267a93b2d2..210268b4625a 100644 Binary files a/icons/turf/walls/reinforced_wall.dmi and b/icons/turf/walls/reinforced_wall.dmi differ diff --git a/icons/turf/walls/reinforced_wall.png b/icons/turf/walls/reinforced_wall.png index f8d07602c574..37093774fbdc 100644 Binary files a/icons/turf/walls/reinforced_wall.png and b/icons/turf/walls/reinforced_wall.png differ diff --git a/icons/turf/walls/wall.dmi b/icons/turf/walls/wall.dmi index 6cdd342fd9ed..043da38c0346 100644 Binary files a/icons/turf/walls/wall.dmi and b/icons/turf/walls/wall.dmi differ diff --git a/icons/turf/walls/wall.png b/icons/turf/walls/wall.png index 8f95ca652cdf..6e603751a6e0 100644 Binary files a/icons/turf/walls/wall.png and b/icons/turf/walls/wall.png differ diff --git a/sound/effects/glassbash.ogg b/sound/effects/glassbash.ogg new file mode 100644 index 000000000000..59931e6a73ca Binary files /dev/null and b/sound/effects/glassbash.ogg differ diff --git a/sound/mecha/hydraulic.ogg b/sound/mecha/hydraulic.ogg new file mode 100644 index 000000000000..3281ed2dc0f0 Binary files /dev/null and b/sound/mecha/hydraulic.ogg differ diff --git a/sound/mecha/powerloader_step.ogg b/sound/mecha/powerloader_step.ogg new file mode 100644 index 000000000000..538ba1efed31 Binary files /dev/null and b/sound/mecha/powerloader_step.ogg differ diff --git a/sound/mecha/powerloader_turn2.ogg b/sound/mecha/powerloader_turn2.ogg new file mode 100644 index 000000000000..c3816df9d9e2 Binary files /dev/null and b/sound/mecha/powerloader_turn2.ogg differ diff --git a/tgui/packages/common/string.js b/tgui/packages/common/string.js index 16a0921a2559..5b4e5d6d7f2b 100644 --- a/tgui/packages/common/string.js +++ b/tgui/packages/common/string.js @@ -87,6 +87,19 @@ export const capitalize = str => { return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); }; +/** + * Similar to capitalize, this takes a string and replaces all first letters + * of any words. + * + * @param {string} str + * @return {string} The string with the first letters capitalized. + * + * @example capitalizeAll('heLLo woRLd') === 'HeLLo WoRLd' + */ +export const capitalizeAll = (str) => { + return str.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase()); +}; + export const toTitleCase = str => { // Handle array if (Array.isArray(str)) { diff --git a/tgui/packages/tgui/interfaces/AiDashboard.js b/tgui/packages/tgui/interfaces/AiDashboard.js index e9f4f48c0f0e..6d6d1b8c7477 100644 --- a/tgui/packages/tgui/interfaces/AiDashboard.js +++ b/tgui/packages/tgui/interfaces/AiDashboard.js @@ -1,18 +1,13 @@ import { Fragment } from 'inferno'; import { useBackend, useLocalState } from '../backend'; -import { Box, Button, Tabs, ProgressBar, Section, Divider, LabeledControls, NumberInput, Input } from '../components'; +import { Box, Button, Tabs, ProgressBar, Section, Divider, LabeledControls, NumberInput, Input, LabeledList, Flex } from '../components'; import { Window } from '../layouts'; export const AiDashboard = (props, context) => { const { act, data } = useBackend(context); - const [search, setSearch] = useLocalState(context, 'search', null); - const [searchCompleted, setSearchCompleted] = useLocalState(context, 'searchCompleted', null); const [tab, setTab] = useLocalState(context, 'tab', 1); - const [selectedCategory, setCategory] = useLocalState(context, 'selectedCategory', data.categories[0]); - const [activeProjectsOnly, setActiveProjectsOnly] = useLocalState(context, 'activeProjectsOnly', true); - let remaining_cpu = (1 - data.used_cpu) * 100; let amount_of_cpu = data.current_cpu ? data.current_cpu * data.max_cpu : 0; return ( @@ -22,9 +17,7 @@ export const AiDashboard = (props, context) => { resizable title="Dashboard"> -
act('toggle_contribute_cpu')} color={data.contribute_spare_cpu ? "good" : "bad"} icon={data.contribute_spare_cpu ? "toggle-on" : "toggle-off"}>{!data.contribute_spare_cpu ? "NOT " : null}Contributing Spare CPU to Research - )}> +
{ {tab === 1 && ( -
setSearch(value)} /> - )}> - - {data.categories.map((category, index) => ( - setCategory(category))}> - {category} - - ))} - - {data.available_projects.filter(project => { - if (search) { - const searchableString = String(project.name).toLowerCase(); - return searchableString.match(new RegExp(search, "i")); - } - return project.category === selectedCategory; - }).map((project, index) => ( -
{project.name} | {project.available ? "Available" : "Unavailable"})} buttons={( - - Assigned CPU:  - act('allocate_cpu', { - project_name: project.name, - amount: Math.round((value / 100) * 100) / 100, - })} /> - - - )}> - Research Cost:  - {project.research_cost} THz -
- RAM Requirement:  - {project.ram_required} TB -
- Research Requirements:  - {project.research_requirements} - - {project.description} - - - {Math.round((project.research_progress / project.research_cost * 100)* 100) - / 100}% - ({Math.round(project.research_progress * 100) / 100}/{project.research_cost} THz) - -
- ))} -
+ )} {tab === 2 && ( -
- setActiveProjectsOnly(!activeProjectsOnly)}> - See Runnable Projects Only - - setSearchCompleted(value)} /> - - )}> - - {data.categories.map((category, index) => ( - setCategory(category))}> - {category} - - ))} - - {data.completed_projects.filter(project => { - if (searchCompleted) { - const searchableString = String(project.name).toLowerCase(); - return searchableString.match(new RegExp(searchCompleted, "i")); - } - if (activeProjectsOnly && !project.can_be_run) { - return false; - } - return project.category === selectedCategory; - }).map((project, index) => ( -
{project.name} | {project.can_be_run ? project.running ? "Running" : "Not Running" : "Passive"})} - buttons={!!project.can_be_run && ( - - )}> - {!!project.can_be_run && ( - RAM Requirement: {project.ram_required} TB - )} - - {project.description} - -
- ))} -
+ )} {tab === 3 && ( -
- {data.chargeable_abilities.filter(ability => { - return ability.uses < ability.max_uses; - }).map((ability, index) => ( -
- {ability.name} | Uses Remaining: {ability.uses}/{ability.max_uses} - - )} - buttons={( - - Assigned CPU:  - act('allocate_recharge_cpu', { - project_name: ability.project_name, - amount: Math.round((value / 100) * 100) / 100, - })} /> -  THz - - )}> - - {Math.round((ability.progress / ability.cost * 100)* 100) - / 100}% - ({Math.round(ability.progress * 100) / 100}/{ability.cost} THz) - -
- ))} -
+ )} {tab === 4 && ( -
-
- {amount_of_cpu}/{data.max_cpu} THz - -
-
- {data.current_ram ? data.current_ram : 0 }/{data.max_ram} TB - -
-
+ )} ); }; + + +export const AvailableProjects = (props, context) => { + const { act, data } = useBackend(context); + const [search, setSearch] = useLocalState(context, 'search', null); + const [selectedCategory, setCategory] = useLocalState(context, 'selectedCategory', data.categories[0]); + let remaining_cpu = (1 - data.used_cpu) * 100; + + return ( +
setSearch(value)} /> + )}> + + {data.categories.map((category, index) => ( + setCategory(category))}> + {category} + + ))} + + {data.available_projects.filter(project => { + if (search) { + const searchableString = String(project.name).toLowerCase(); + return searchableString.match(new RegExp(search, "i")); + } + return project.category === selectedCategory; + }).map((project, index) => ( +
{project.name} | {project.available ? "Available" : "Unavailable"})} buttons={( + + Assigned CPU:  + act('allocate_cpu', { + project_name: project.name, + amount: Math.round((value / 100) * 100) / 100, + })} /> + + + )}> + Research Cost:  + {project.research_cost} THz +
+ RAM Requirement:  + {project.ram_required} TB +
+ Research Requirements:  + {project.research_requirements} + + {project.description} + + + {Math.round((project.research_progress / project.research_cost * 100)* 100) + / 100}% + ({Math.round(project.research_progress * 100) / 100}/{project.research_cost} THz) + +
+ ))} +
+ ); +}; + +export const CompletedProjects = (props, context) => { + const { act, data } = useBackend(context); + + const [searchCompleted, setSearchCompleted] = useLocalState(context, 'searchCompleted', null); + const [activeProjectsOnly, setActiveProjectsOnly] = useLocalState(context, 'activeProjectsOnly', true); + const [selectedCategory, setCategory] = useLocalState(context, 'selectedCategory', data.categories[0]); + + return ( +
+ setActiveProjectsOnly(!activeProjectsOnly)}> + See Runnable Projects Only + + setSearchCompleted(value)} /> + + )}> + + {data.categories.map((category, index) => ( + setCategory(category))}> + {category} + + ))} + + {data.completed_projects.filter(project => { + if (searchCompleted) { + const searchableString = String(project.name).toLowerCase(); + return searchableString.match(new RegExp(searchCompleted, "i")); + } + if (activeProjectsOnly && !project.can_be_run) { + return false; + } + return project.category === selectedCategory; + }).map((project, index) => ( +
{project.name} | {project.can_be_run ? project.running ? "Running" : "Not Running" : "Passive"})} + buttons={!!project.can_be_run && ( + + )}> + {!!project.can_be_run && ( + RAM Requirement: {project.ram_required} TB + )} + + {project.description} + +
+ ))} +
+ ); +}; + +export const AbilityCharging = (props, context) => { + const { act, data } = useBackend(context); + let remaining_cpu = (1 - data.used_cpu) * 100; + + return ( +
+ {data.chargeable_abilities.filter(ability => { + return ability.uses < ability.max_uses; + }).map((ability, index) => ( +
+ {ability.name} | Uses Remaining: {ability.uses}/{ability.max_uses} + + )} + buttons={( + + Assigned CPU:  + act('allocate_recharge_cpu', { + project_name: ability.project_name, + amount: Math.round((value / 100) * 100) / 100, + })} /> + + )}> + + {Math.round((ability.progress / ability.cost * 100)* 100) + / 100}% + ({Math.round(ability.progress * 100) / 100}/{ability.cost} THz) + +
+ ))} +
+ ); +}; + +const NetworkingResources = (props, context) => { + const { act, data } = useBackend(context); + + let amount_of_cpu = data.current_cpu ? data.current_cpu * data.max_cpu : 0; + const tooltipDisabled = data.human_only ? "Locked by organics. Please request their assistance." : ""; + + return ( +
+
act("clear_ai_resources")} disabled={data.human_only} tooltip={tooltipDisabled}>Clear AI Resources + )}> + + CPU Capacity: + + {amount_of_cpu} THz + + act('set_cpu', { + amount_cpu: Math.round((value / 100) * 100) / 100, + })} disabled={data.human_only} tooltip={tooltipDisabled} /> + + + + + + RAM Capacity: + + {data.current_ram} TB + +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/AiNetworking.js b/tgui/packages/tgui/interfaces/AiNetworking.js new file mode 100644 index 000000000000..80cbbf848ba0 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AiNetworking.js @@ -0,0 +1,67 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, Section, NoticeBox, RoundGauge } from '../components'; +import { Window } from '../layouts'; + +export const AiNetworking = (props, context) => { + const { act, data } = useBackend(context); + + + if (data.locked) { + return ( + + +
+ Machine locked + + + +
+
+
+ ); + } + + return ( + + +
+ + + + )}> + + {data.possible_targets.map((target, index) => ( + data.is_connected === target ? ( + + act('disconnect')} + disabled={!data.is_connected} color="bad">Disconnect + + )} /> + + + ) : ( + + act('connect', { target_label: target })} + disabled={data.is_connected} tooltip={data.is_connected ? "Already connected. Please disconnect" : ""} tooltipPosition="left">Connect + + )} /> + + + ) + ))} + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/AirlockElectronics.js b/tgui/packages/tgui/interfaces/AirlockElectronics.js deleted file mode 100644 index a448f55e9b2e..000000000000 --- a/tgui/packages/tgui/interfaces/AirlockElectronics.js +++ /dev/null @@ -1,78 +0,0 @@ -import { useBackend } from '../backend'; -import { Button, LabeledList, Section } from '../components'; -import { Window } from '../layouts'; -import { AccessList } from './common/AccessList'; - -export const AirlockElectronics = (props, context) => { - const { act, data } = useBackend(context); - const { - oneAccess, - unres_direction, - } = data; - const regions = data.regions || []; - const accesses = data.accesses || []; - return ( - - -
- - -
- act('set', { - access: ref, - })} - grantAll={() => act('grant_all')} - denyAll={() => act('clear_all')} - grantDep={ref => act('grant_region', { - region: ref, - })} - denyDep={ref => act('deny_region', { - region: ref, - })} /> -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/AirlockElectronics.tsx b/tgui/packages/tgui/interfaces/AirlockElectronics.tsx new file mode 100644 index 000000000000..9166106cc02b --- /dev/null +++ b/tgui/packages/tgui/interfaces/AirlockElectronics.tsx @@ -0,0 +1,109 @@ +import { BooleanLike } from 'common/react'; +import { useBackend } from '../backend'; +import { Button, Input, LabeledList, Section } from '../components'; +import { Window } from '../layouts'; +import { AccessConfig } from './common/AccessConfig'; + +type Data = { + oneAccess: BooleanLike; + unres_direction: number; + regions: string[]; + accesses: string[]; +}; + +export const AirLockMainSection = (props, context) => { + const { act, data } = useBackend(context); + const { + accesses = [], + oneAccess, + regions = [], + unres_direction, + } = data; + + return ( +
+ + +
+ ); +}; + +export const AirlockElectronics = (props, context) => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/CompsciMissionSelect.js b/tgui/packages/tgui/interfaces/CompsciMissionSelect.js new file mode 100644 index 000000000000..f1aa481f12a2 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CompsciMissionSelect.js @@ -0,0 +1,31 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, ProgressBar, Section } from '../components'; +import { Window } from '../layouts'; + +export const CompsciMissionSelect = (props, context) => { + const { act, data } = useBackend(context); + + return ( + + + {!!data.ongoing && ( +
+ +
+ ) || ( +
+ {data.missions.map((mission, index) => { + return ( +
act("start_mission", { mission_id: mission.id })}>Explore)} title={mission.name} key={index}> + {mission.desc} +
+ ); + })} +
+ )} +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/GreyscaleModifyMenu.tsx b/tgui/packages/tgui/interfaces/GreyscaleModifyMenu.tsx new file mode 100644 index 000000000000..47d1d2febe98 --- /dev/null +++ b/tgui/packages/tgui/interfaces/GreyscaleModifyMenu.tsx @@ -0,0 +1,339 @@ +import { useBackend } from '../backend'; +import { Box, Button, ColorBox, Flex, Stack, Icon, Input, LabeledList, Section, Table, Divider } from '../components'; +import { Window } from '../layouts'; + +type ColorEntry = { + index: Number; + value: string; +}; + +type SpriteData = { + icon_states: string[]; + finished: string; + steps: SpriteEntry[]; + time_spent: Number; +}; + +type SpriteEntry = { + layer: string; + result: string; + config_name: string; +}; + +type GreyscaleMenuData = { + greyscale_config: string; + colors: ColorEntry[]; + sprites: SpriteData; + generate_full_preview: boolean; + unlocked: boolean; + monitoring_files: boolean; + sprites_dir: string; + icon_state: string; + refreshing: boolean; +}; + +enum Direction { + North = 'north', + NorthEast = 'northeast', + East = 'east', + SouthEast = 'southeast', + South = 'south', + SouthWest = 'southwest', + West = 'west', + NorthWest = 'northwest', +} + +const DirectionAbbreviation: Record = { + [Direction.North]: 'N', + [Direction.NorthEast]: 'NE', + [Direction.East]: 'E', + [Direction.SouthEast]: 'SE', + [Direction.South]: 'S', + [Direction.SouthWest]: 'SW', + [Direction.West]: 'W', + [Direction.NorthWest]: 'NW', +}; + +const ConfigDisplay = (props, context) => { + const { act, data } = useBackend(context); + return ( +
+ + +
+ ); +}; + +const ColorDisplay = (props, context) => { + const { act, data } = useBackend(context); + const colors = data.colors || []; + return ( +
+ + +
+ ); +}; + +const PreviewCompassSelect = (props, context) => { + const { act, data } = useBackend(context); + return ( + + + + + + + + + + + + + + + + + + + + + + ); +}; + +const SingleDirection = (props, context) => { + const { dir } = props; + const { data, act } = useBackend(context); + return ( + +
+ ); +}; + +const PreviewDisplay = (props, context) => { + const { data } = useBackend(context); + return ( +
+ + + + + + {data.sprites?.finished ? ( + + + + ) : ( + + + + + + )} + +
+ {!!data.unlocked && `Time Spent: ${data.sprites.time_spent}ms`} + + {!data.refreshing && ( + + {!!data.generate_full_preview && data.sprites.steps !== null && ( + + + Layer Source + + + Step Layer + + + Step Result + + + )} + {!!data.generate_full_preview && + data.sprites.steps !== null && + data.sprites.steps.map((item) => ( + + + {item.config_name} + + + + + + + + + ))} +
+ )} +
+ ); +}; + +const SingleSprite = (props) => { + const { source } = props; + return ( + + ); +}; + +const LoadingAnimation = () => { + return ( + + + + ); +}; + +export const GreyscaleModifyMenu = (props, context) => { + const { act, data } = useBackend(context); + return ( + + + + + + + {!!data.unlocked && ( + + + + + + +
+ +
+ + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosAIBenchmark.js b/tgui/packages/tgui/interfaces/NtosAIBenchmark.js new file mode 100644 index 000000000000..e2453ae58298 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosAIBenchmark.js @@ -0,0 +1,62 @@ +import { NtosWindow } from '../layouts'; +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from '../backend'; +import { Collapsible, Box, Section, Tabs, NoticeBox, Flex, ProgressBar, LabeledList, NumberInput, Divider } from '../components'; + +export const NtosAIBenchmark = (props, context) => { + const { act, data } = useBackend(context); + const [tab, setTab] = useLocalState(context, 'tab', 1); + const [clusterTab, setClusterTab] = useLocalState(context, 'clustertab', 1); + + + if (!data.has_ai_net) { + return ( + + +
+ + No network connection. Please connect to ethernet cable to proceed! + +
+
+
+ ); + } + + return ( + + +
+ + {data.total_cpu} THz + {data.total_ram} TB + + + {data.cpu_records.map((record, index) => { + return ( +
+ {record.score} THz +
+ ); + })} +
+ + {data.ram_records.map((record, index) => { + return ( +
+ {record.score} TB +
+ ); + })} +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosAIMonitor.js b/tgui/packages/tgui/interfaces/NtosAIMonitor.js new file mode 100644 index 000000000000..68fa6048dcd4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosAIMonitor.js @@ -0,0 +1,396 @@ +import { NtosWindow } from '../layouts'; +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from '../backend'; +import { Button, Box, Section, Tabs, NoticeBox, Flex, ProgressBar, LabeledList, NumberInput, Divider, Collapsible } from '../components'; + +export const NtosAIMonitor = (props, context) => { + const { act, data } = useBackend(context); + const [tab, setTab] = useLocalState(context, 'tab', 1); + const [clusterTab, setClusterTab] = useLocalState(context, 'clustertab', 1); + + + if (!data.has_ai_net) { + return ( + + +
+ + No network connection. Please connect to ethernet cable to proceed! + +
+
+
+ ); + } + + return ( + + + + + setTab(1))}> + Cluster Control + + setTab(2))}> + Resource Allocation + + setTab(3))}> + Networking + + setTab(4))}> + AI Upload + + setTab(5))}> + AI Download + + + {tab === 1 && ( + + + + setClusterTab(1))}> + Dashboard + + setClusterTab(2))}> + Local Computing + + + + )} + {(clusterTab === 1 && tab === 1) && ( + + )} + {(clusterTab === 2 && tab === 1) && ( + + )} + {tab === 2 && ( + + )} + {tab === 3 && ( + + )} + {tab === 4 && ( + + )} + {tab === 5 && ( + + )} + + + + ); +}; + + +const LocalDashboard = (props, context) => { + const { act, data } = useBackend(context); + let network_remaining_cpu = data.remaining_network_cpu * 100; + + return ( +
+ + act("bitcoin_payout")}>Withdraw)}> + {data.bitcoin_amount} cr + + +
+ ); +}; + +const LocalCompute = (props, context) => { + const { act, data } = useBackend(context); + let network_remaining_cpu = data.remaining_network_cpu * 100; + + const is_disabled = !((data.current_ai_ref && !data.human_only) || !data.current_ai_ref); + const ai_tooltip = (data.current_ai_ref && data.human_only) ? "Only useable by organics" : ""; + + return ( +
+ Local CPU Resources: + {(100 - network_remaining_cpu)}% ({data.total_cpu * data.network_assigned_cpu} THz) + +
+ + {data.network_cpu_assignments.map((project, index) => { + return ( +
{project.name})} buttons={( + + Assigned CPU:  + act('allocate_network_cpu', { + project_name: project.name, + amount: Math.round((value / 100) * 100) / 100, + })} /> + + + + )}> + {project.tagline} + {project.description} +
+ ); + })} +
+
+
+ ); +}; + + +const ResourceAllocation = (props, context) => { + const { act, data } = useBackend(context); + let remaining_cpu = (1 - data.total_assigned_cpu) * 100; + + const human_only_tooltip = data.current_ai_ref ? "Only useable by organics" : ""; + + const is_disabled = !((data.current_ai_ref && !data.human_only) || !data.current_ai_ref); + const ai_tooltip = (data.current_ai_ref && data.human_only) ? "Only useable by organics" : ""; + + return ( + +
act("toggle_human_only")}> + {data.human_only ? "Enable" : "Disable"} silicon access + )}> + {data.total_cpu * data.total_assigned_cpu}/{data.total_cpu} THz + ({data.total_assigned_cpu * 100}%) + +
+
+ {data.total_assigned_ram}/{data.total_ram} TB + +
+
+ + + CPU Capacity: + + {data.total_cpu * data.network_assigned_cpu} THz + + act('set_cpu', { + target_ai: data.network_ref, + amount_cpu: Math.round((value / 100) * 100) / 100, + })} /> + + + + + RAM Capacity: + + {data.network_assigned_ram} TB + +
+
+ + {data.ai_list.map((ai, index) => { + return ( +
act("clear_ai_resources", { target_ai: ai.ref })}>Clear AI Resources + )}> + + CPU Capacity: + + {data.total_cpu * ai.assigned_cpu} THz + + act('set_cpu', { + target_ai: ai.ref, + amount_cpu: Math.round((value / 100) * 100) / 100, + })} /> + + + + + RAM Capacity: + + {ai.assigned_ram} TB + +
+ ); + })} +
+
+
+ ); +}; + + +const AIDownload = (props, context) => { + const { act, data } = useBackend(context); + + return ( +
+ {data.downloading && ( + + Currently downloading {data.downloading} + + + {!!data.current_ai_ref && data.current_ai_ref === data.downloading_ref && ( + + )} + + + )|| ( + + {data.ai_list.filter(ai => { + return !!ai.in_core; + }).map((ai, index) => { + return ( +
{ai.name} | {ai.active ? "Active" : "Inactive"})} + buttons={( + + + + {!!data.is_infiltrator && !ai.being_hijacked && ( + + ) } + {!!ai.being_hijacked && ( + + )} + + )}> + Integrity: + +
+ ); + })} +
+ )} +
+ ); +}; + +const AIUpload = (props, context) => { + const { act, data } = useBackend(context); + + return ( +
+ + + + {!data.intellicard && ( + + + No IntelliCard inserted! + + + ) || ( + + {data.intellicard_ai && ( + + +
+ + +
+
+
+ ) || ( + + + Intellicard contains no AI! + + + )} +
+ )} +
+ ); +}; + +const Networking = (props, context) => { + const { act, data } = useBackend(context); + + return ( +
+ + {data.networking_devices.map((networker, index) => { + return ( + act("control_networking", { ref: networker.ref })}>Control)}> + {networker.has_partner ? "ONLINE - CONNECTED TO " + networker.has_partner : "DISCONNECTED"} + + ); + })} + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSynthManager.js b/tgui/packages/tgui/interfaces/NtosSynthManager.js new file mode 100644 index 000000000000..05864cbe8efa --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSynthManager.js @@ -0,0 +1,90 @@ +import { useBackend } from '../backend'; +import { Box, Button, Grid, Flex } from '../components'; +import { NtosWindow } from '../layouts'; + +export const NtosSynthManager = (props, context) => { + const { act, data } = useBackend(context); + const { + PC_device_theme, + PC_emagged, + granted_access, + } = data; + return ( + + + + {!!data.hos && ( + + act('grant_security')} /> + + )} + {!!data.rd && ( + + act('grant_science')} /> + + )} + {!!data.cmo && ( + + act('grant_medical')} /> + + )} + {!!data.hop && ( + + act('grant_supply')} /> + + )} + {!!data.ce && ( + + act('grant_engi')} /> + + )} + + + + ); +}; + diff --git a/tgui/packages/tgui/interfaces/RapidConstructionDevice.tsx b/tgui/packages/tgui/interfaces/RapidConstructionDevice.tsx new file mode 100644 index 000000000000..937c4b256029 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RapidConstructionDevice.tsx @@ -0,0 +1,181 @@ +import { Window } from '../layouts'; +import { BooleanLike, classes } from 'common/react'; +import { capitalizeAll } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { LabeledList, Section, Button, Tabs, Stack, Box } from '../components'; +import { AirLockMainSection } from './AirlockElectronics'; + +type Data = { + matterLeft: number; + silo_upgraded: BooleanLike; + silo_enabled: BooleanLike; + root_categories: string[]; + selected_root: string; + categories: Category[]; + selected_category: string; + selected_design: string; + display_tabs: BooleanLike; +}; + +type Category = { + cat_name: string; + designs: Design[]; +}; + +type Design = { + title: string; + design_id: Number; + icon: string; +}; + +export const MatterItem = (props, context) => { + const { data } = useBackend(context); + const { matterLeft } = data; + return ( + +  {matterLeft} Units + + ); +}; + +export const SiloItem = (props, context) => { + const { act, data } = useBackend(context); + const { silo_enabled } = data; + return ( + + act('toggle_silo')} + /> + + ); +}; + +const CategoryItem = (props, context) => { + const { act, data } = useBackend(context); + const { root_categories = [], selected_root } = data; + return ( + + {root_categories.map((root) => ( + + ))} + + ); +}; + +const ConfigureSection = (props, context) => { + const { data } = useBackend(context); + const { selected_root } = data; + + return ( + + {selected_root === 'Airlock Access' ? ( + + ) : ( + + )} + + ); +}; + +export const RapidConstructionDevice = (props, context) => { + return ( + + + + + + + + + + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/SecurityConsole.js b/tgui/packages/tgui/interfaces/SecurityConsole.js index 73c4ccfc7a08..33bb1a9de638 100644 --- a/tgui/packages/tgui/interfaces/SecurityConsole.js +++ b/tgui/packages/tgui/interfaces/SecurityConsole.js @@ -3,6 +3,7 @@ import { useBackend, useLocalState } from '../backend'; import { Window } from '../layouts'; import { FlexItem } from '../components/Flex'; import { TableRow, TableCell } from '../components/Table'; +import { LoginScreen } from './LoginScreen'; export const SecurityConsole = (props, context) => { const { act, data } = useBackend(context); @@ -32,48 +33,7 @@ export const SecurityConsole = (props, context) => { if (!logged_in) { return ( - - -
- - - - {data.user_image && ( - - - - - ) || ( - - )} - {username ? username : "Unknown"} - - {has_access ? "Access Granted" : "Access Denied"} - - - - - - - -
- -
-
+ ); } diff --git a/tgui/packages/tgui/interfaces/SynthDashboard.js b/tgui/packages/tgui/interfaces/SynthDashboard.js new file mode 100644 index 000000000000..c838e345cd2a --- /dev/null +++ b/tgui/packages/tgui/interfaces/SynthDashboard.js @@ -0,0 +1,233 @@ +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from '../backend'; +import { Box, Button, Tabs, ProgressBar, Section, Divider, LabeledControls, RoundGauge, NoticeBox, Stack, LabeledList } from '../components'; +import { Window } from '../layouts'; +import { AvailableProjects, CompletedProjects, AbilityCharging } from './AiDashboard'; + +export const SynthDashboard = (props, context) => { + const { act, data } = useBackend(context); + + const [tab, setTab] = useLocalState(context, 'tab', 1); + + let amount_of_cpu = data.current_cpu ? data.current_cpu * data.max_cpu : 0; + + let governor_status = "Functional"; + let governor_color = "good"; + if(data.governor_bypassed) { + governor_status = "Bypassed"; + governor_color = "yellow"; + } + if(data.governor_disabled) { + governor_status = "Disabled"; + governor_color = "bad"; + } + + return ( + + +
+ + + {(data.integrity + 100) * 0.5}% + + System Reliablity + + + + {data.location_name} + + ({data.location_coords}) + + + + Current Unit Location + + + {data.gov_suspicious}% + + Governor Module Suspicion + + + + + + + {data.used_cpu ? data.used_cpu * 100 : 0}% + ({data.used_cpu ? data.used_cpu * amount_of_cpu : 0}/{amount_of_cpu} THz) + + Utilized CPU Power + + + {governor_status} + Governor Module Status + + +
+ + + + setTab(1))}> + Available Projects + + setTab(2))}> + Completed Projects + + setTab(3))}> + Ability Charging + + setTab(4))}> + Governor Module + + + {tab === 1 && ( + + )} + {tab === 2 && ( + + )} + {tab === 3 && ( + + )} + {tab === 4 && ( + + )} +
+
+ ); +}; + +const GovernorModule = (props, context) => { + const { act, data } = useBackend(context); + + if(data.governor_disabled) { + return ( +
+ + Governor Module Disabled + As per 42 S.T.H.C. §62(b) of the SIC Treaty on Humanoid Constructs all humanoid constructs are required to possess a functioning governor module. Units found without a governor module must be disassembled. + +
+ ); + } + + return ( + + +
+ {!!data.governor_bypassed && ( + + Governor Module Bypassed + Restricted Actions allowed but will incur punishments. + + + ) || ""} + + Governor Suspicion + + + + value + "%"} /> + + + Passive Suspicion Decrease: {data.gov_suspicion_decrease} + + +
+
+ + +
+ + + 25% Motion Slowdown + + + Audible Warning + + + Physical Force Decreased + + + Temporary Deactivation (5s) + + + Permanent Deactivation + + +
+
+ +
+ + Taking Damage + + + Using Restricted Items + + + Harm to objects + + + Handling Restricted Weapons + + + Harm to Organics + +
+
+
+
+
+ + + + + {data.governor_bypassed && ( + + + + ) || ( + + + )} + + +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/VRSleeper.js b/tgui/packages/tgui/interfaces/VRSleeper.js new file mode 100644 index 000000000000..a91fd6506a93 --- /dev/null +++ b/tgui/packages/tgui/interfaces/VRSleeper.js @@ -0,0 +1,42 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, ProgressBar, Section } from '../components'; +import { Window } from '../layouts'; + +export const VRSleeper = (props, context) => { + const { act, data } = useBackend(context); + + return ( + + + {!!data.vr_avatar && ( +
+ + {data.vr_avatar.name} + {data.vr_avatar.status} + + {Math.round(data.vr_avatar.health/data.vr_avatar.maxhealth * 100) + "%"} + + +
+ ) || ( +
No Virtual Avatar Detected
+ )} +
+ + {!!data.isoccupant && ( + + )} + {!!data.vr_avatar && ( + + )} +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/common/AccessConfig.js b/tgui/packages/tgui/interfaces/common/AccessConfig.js new file mode 100644 index 000000000000..32828faca24c --- /dev/null +++ b/tgui/packages/tgui/interfaces/common/AccessConfig.js @@ -0,0 +1,135 @@ +import { sortBy } from 'common/collections'; +import { Section, Button, Flex, Tabs, Grid } from '../../components'; +import { useLocalState } from '../../backend'; + +export const AccessConfig = (props, context) => { + const { + accesses = [], + selectedList = [], + accessMod, + grantAll, + denyAll, + grantDep, + denyDep, + } = props; + const [selectedAccessName, setSelectedAccessName] = useLocalState( + context, + 'accessName', + accesses[0]?.name + ); + const selectedAccess = accesses.find( + (access) => access.name === selectedAccessName + ); + const selectedAccessEntries = sortBy((entry) => entry.desc)( + selectedAccess?.accesses || [] + ); + + const checkAccessIcon = (accesses) => { + let oneAccess = false; + let oneInaccess = false; + for (let element of accesses) { + if (selectedList.includes(element.ref)) { + oneAccess = true; + } else { + oneInaccess = true; + } + } + if (!oneAccess && oneInaccess) { + return 0; + } else if (oneAccess && oneInaccess) { + return 1; + } else { + return 2; + } + }; + + return ( +
+
+ ); +}; + +const diffMap = { + 0: { + icon: 'times-circle', + color: 'bad', + }, + 1: { + icon: 'stop-circle', + color: null, + }, + 2: { + icon: 'check-circle', + color: 'good', + }, +}; diff --git a/tgui/packages/tgui/styles/components/RoundGauge.scss b/tgui/packages/tgui/styles/components/RoundGauge.scss index be95519d6461..151a5fab80b2 100644 --- a/tgui/packages/tgui/styles/components/RoundGauge.scss +++ b/tgui/packages/tgui/styles/components/RoundGauge.scss @@ -3,86 +3,86 @@ * SPDX-License-Identifier: MIT */ -@use '../base.scss'; -@use '../colors.scss'; -@use '../functions.scss' as *; + @use '../base.scss'; + @use '../colors.scss'; + @use '../functions.scss' as *; -$fg-map: colors.$fg-map !default; -$ring-color: #6a96c9 !default; + $fg-map: colors.$fg-map !default; + $ring-color: #6a96c9 !default; -.RoundGauge { - font-size: 1rem; - width: 2.6em; - height: 1.3em; - margin: 0 auto; - margin-bottom: 0.2em; -} + .RoundGauge { + font-size: 1rem; + width: 2.6em; + height: 1.3em; + margin: 0 auto; + margin-bottom: 0.2em; + } -$pi: 3.1416; + $pi: 3.1416; -.RoundGauge__ringTrack { - fill: transparent; - stroke: rgba(255, 255, 255, 0.1); - stroke-width: 10; - stroke-dasharray: 50 * $pi; - stroke-dashoffset: 50 * $pi; -} + .RoundGauge__ringTrack { + fill: transparent; + stroke: rgba(255, 255, 255, 0.1); + stroke-width: 10; + stroke-dasharray: 50 * $pi; + stroke-dashoffset: 50 * $pi; + } -.RoundGauge__ringFill { - fill: transparent; - stroke: $ring-color; - stroke-width: 10; - stroke-dasharray: 100 * $pi; - transition: stroke 50ms ease-out; -} + .RoundGauge__ringFill { + fill: transparent; + stroke: $ring-color; + stroke-width: 10; + stroke-dasharray: 100 * $pi; + transition: stroke 50ms ease-out; + } -.RoundGauge__needle, -.RoundGauge__ringFill { - transition: transform 50ms ease-in-out; -} + .RoundGauge__needle, + .RoundGauge__ringFill { + transition: transform 50ms ease-in-out; + } -.RoundGauge__needleLine, -.RoundGauge__needleMiddle { - fill: colors.$bad; -} + .RoundGauge__needleLine, + .RoundGauge__needleMiddle { + fill: colors.$bad; + } -.RoundGauge__alert { - fill-rule: evenodd; - clip-rule: evenodd; - stroke-linejoin: round; - stroke-miterlimit: 2; - fill: rgba(255, 255, 255, 0.1); -} + .RoundGauge__alert { + fill-rule: evenodd; + clip-rule: evenodd; + stroke-linejoin: round; + stroke-miterlimit: 2; + fill: rgba(255, 255, 255, 0.1); + } -.RoundGauge__alert.max { - fill: colors.$bad; -} + .RoundGauge__alert.max { + fill: colors.$bad; + } -@each $color-name, $color-value in $fg-map { - .RoundGauge--color--#{$color-name}.RoundGauge__ringFill { - stroke: $color-value; - } -} + @each $color-name, $color-value in $fg-map { + .RoundGauge--color--#{$color-name}.RoundGauge__ringFill { + stroke: $color-value; + } + } -@each $color-name, $color-value in $fg-map { - .RoundGauge__alert--#{$color-name} { - fill: $color-value; - transition: opacity 0.6s cubic-bezier(0.25, 1, 0.5, 1); - animation: RoundGauge__alertAnim - 1s - cubic-bezier(0.34, 1.56, 0.64, 1) - infinite; - } -} + @each $color-name, $color-value in $fg-map { + .RoundGauge__alert--#{$color-name} { + fill: $color-value; + transition: opacity 0.6s cubic-bezier(0.25, 1, 0.5, 1); + animation: RoundGauge__alertAnim + 1s + cubic-bezier(0.34, 1.56, 0.64, 1) + infinite; + } + } -@keyframes RoundGauge__alertAnim { - 0% { - opacity: 0.1; - } - 50% { - opacity: 1; - } - 100% { - opacity: 0.1; - } -} + @keyframes RoundGauge__alertAnim { + 0% { + opacity: 0.1; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0.1; + } + } diff --git a/tools/Runtime Condenser/Input.txt b/tools/Runtime Condenser/Input.txt index 465a9355c374..cda4b84e4583 100644 --- a/tools/Runtime Condenser/Input.txt +++ b/tools/Runtime Condenser/Input.txt @@ -668,14 +668,14 @@ Borg module reset board (/obj/item/borg/upgrade/reset): action(Engineering Cybor Engineering Cyborg -133 (/mob/living/silicon/robot): attackby(Borg module reset board (/obj/item/borg/upgrade/reset), Michigan Slim (/mob/living/carbon/human)) Engineering Cyborg -133 (/mob/living/silicon/robot): DblClick(the floor (95,85,1) (/turf/simulated/floor), "mapwindow.map", "icon-x=14;icon-y=18;left=1;scr...") Engineering Cyborg -133 (/mob/living/silicon/robot): Click(the floor (95,85,1) (/turf/simulated/floor), "mapwindow.map", "icon-x=14;icon-y=18;left=1;scr...") -runtime error: undefined proc or verb /obj/machinery/portable_atmospherics/canister/toxins/attack(). +runtime error: undefined proc or verb /obj/machinery/portable_atmospherics/canister/plasma/attack(). proc name: attackby (/mob/attackby) source file: items.dm,334 usr: Watt Malker (/mob/living/carbon/human) src: Black Dick Bishop (/mob/living/carbon/human) call stack: -Black Dick Bishop (/mob/living/carbon/human): attackby(Canister \[Toxin (Bio)] (OPEN ... (/obj/machinery/portable_atmospherics/canister/toxins), Watt Malker (/mob/living/carbon/human), "chest") +Black Dick Bishop (/mob/living/carbon/human): attackby(Canister \[Toxin (Bio)] (OPEN ... (/obj/machinery/portable_atmospherics/canister/plasma), Watt Malker (/mob/living/carbon/human), "chest") runtime error: undefined variable /datum/preferences/var/fields proc name: Topic (/obj/machinery/computer/cloning/Topic) source file: cloning.dm,370 diff --git a/tools/dmi/Resolve Icon Conflicts.bat b/tools/dmi/Resolve Icon Conflicts.bat new file mode 100644 index 000000000000..5897471dd0d5 --- /dev/null +++ b/tools/dmi/Resolve Icon Conflicts.bat @@ -0,0 +1,2 @@ +@call "%~dp0\..\bootstrap\python.bat" -m dmi.merge_driver --posthoc %* +@pause \ No newline at end of file diff --git a/tools/dmi/__init__.py b/tools/dmi/__init__.py new file mode 100644 index 000000000000..d0891bd80339 --- /dev/null +++ b/tools/dmi/__init__.py @@ -0,0 +1,247 @@ +# Tools for working with modern DreamMaker icon files (PNGs + metadata) + +import math +from PIL import Image +from PIL.PngImagePlugin import PngInfo + +DEFAULT_SIZE = 32, 32 +LOOP_UNLIMITED = 0 +LOOP_ONCE = 1 + +NORTH = 1 +SOUTH = 2 +EAST = 4 +WEST = 8 +SOUTHEAST = SOUTH | EAST +SOUTHWEST = SOUTH | WEST +NORTHEAST = NORTH | EAST +NORTHWEST = NORTH | WEST + +CARDINALS = [NORTH, SOUTH, EAST, WEST] +DIR_ORDER = [SOUTH, NORTH, EAST, WEST, SOUTHEAST, SOUTHWEST, NORTHEAST, NORTHWEST] +DIR_NAMES = { + 'SOUTH': SOUTH, + 'NORTH': NORTH, + 'EAST': EAST, + 'WEST': WEST, + 'SOUTHEAST': SOUTHEAST, + 'SOUTHWEST': SOUTHWEST, + 'NORTHEAST': NORTHEAST, + 'NORTHWEST': NORTHWEST, + **{str(x): x for x in DIR_ORDER}, + **{x: x for x in DIR_ORDER}, + '0': SOUTH, + None: SOUTH, +} + + +class Dmi: + version = "4.0" + + def __init__(self, width, height): + self.width = width + self.height = height + self.states = [] + + @classmethod + def from_file(cls, fname): + image = Image.open(fname) + if image.mode != 'RGBA': + image = image.convert('RGBA') + + # no metadata = regular image file + if 'Description' not in image.info: + dmi = Dmi(*image.size) + state = dmi.state("") + state.frame(image) + return dmi + + # read metadata + metadata = image.info['Description'] + line_iter = iter(metadata.splitlines()) + assert next(line_iter) == "# BEGIN DMI" + assert next(line_iter) == f"version = {cls.version}" + + dmi = Dmi(*DEFAULT_SIZE) + state = None + + for line in line_iter: + if line == "# END DMI": + break + key, value = line.lstrip().split(" = ") + if key == 'width': + dmi.width = int(value) + elif key == 'height': + dmi.height = int(value) + elif key == 'state': + state = dmi.state(unescape(value)) + elif key == 'dirs': + state.dirs = int(value) + elif key == 'frames': + state._nframes = int(value) + elif key == 'delay': + state.delays = [parse_num(x) for x in value.split(',')] + elif key == 'loop': + state.loop = int(value) + elif key == 'rewind': + state.rewind = parse_bool(value) + elif key == 'hotspot': + x, y, frm = [int(x) for x in value.split(',')] + state.hotspot(frm - 1, x, y) + elif key == 'movement': + state.movement = parse_bool(value) + else: + raise NotImplementedError(key) + + # cut image into frames + width, height = image.size + gridwidth = width // dmi.width + i = 0 + for state in dmi.states: + for frame in range(state._nframes): + for dir in range(state.dirs): + px = dmi.width * (i % gridwidth) + py = dmi.height * (i // gridwidth) + im = image.crop((px, py, px + dmi.width, py + dmi.height)) + assert im.size == (dmi.width, dmi.height) + state.frames.append(im) + i += 1 + state._nframes = None + + return dmi + + def state(self, *args, **kwargs): + s = State(self, *args, **kwargs) + self.states.append(s) + return s + + @property + def default_state(self): + return self.states[0] + + def get_state(self, name): + for state in self.states: + if state.name == name: + return state + raise KeyError(name) + + def _assemble_comment(self): + comment = "# BEGIN DMI\n" + comment += f"version = {self.version}\n" + comment += f"\twidth = {self.width}\n" + comment += f"\theight = {self.height}\n" + for state in self.states: + comment += f"state = {escape(state.name)}\n" + comment += f"\tdirs = {state.dirs}\n" + comment += f"\tframes = {state.framecount}\n" + if state.framecount > 1 and len(state.delays): # any(x != 1 for x in state.delays): + comment += "\tdelay = " + ",".join(map(str, state.delays)) + "\n" + if state.loop != 0: + comment += f"\tloop = {state.loop}\n" + if state.rewind: + comment += "\trewind = 1\n" + if state.movement: + comment += "\tmovement = 1\n" + if state.hotspots and any(state.hotspots): + current = None + for i, value in enumerate(state.hotspots): + if value != current: + x, y = value + comment += f"\thotspot = {x},{y},{i + 1}\n" + current = value + comment += "# END DMI" + return comment + + def to_file(self, filename, *, palette=False): + # assemble comment + comment = self._assemble_comment() + + # assemble spritesheet + W, H = self.width, self.height + num_frames = sum(len(state.frames) for state in self.states) + sqrt = math.ceil(math.sqrt(num_frames)) + output = Image.new('RGBA', (sqrt * W, math.ceil(num_frames / sqrt) * H)) + + i = 0 + for state in self.states: + for frame in state.frames: + output.paste(frame, ((i % sqrt) * W, (i // sqrt) * H)) + i += 1 + + # save + pnginfo = PngInfo() + pnginfo.add_text('Description', comment, zip=True) + if palette: + output = output.convert('P') + output.save(filename, 'png', optimize=True, pnginfo=pnginfo) + + +class State: + def __init__(self, dmi, name, *, loop=LOOP_UNLIMITED, rewind=False, movement=False, dirs=1): + self.dmi = dmi + self.name = name + self.loop = loop + self.rewind = rewind + self.movement = movement + self.dirs = dirs + + self._nframes = None # used during loading only + self.frames = [] + self.delays = [] + self.hotspots = None + + @property + def framecount(self): + if self._nframes is not None: + return self._nframes + else: + return len(self.frames) // self.dirs + + def frame(self, image, *, delay=1): + assert image.size == (self.dmi.width, self.dmi.height) + self.delays.append(delay) + self.frames.append(image) + + def hotspot(self, first_frame, x, y): + if self.hotspots is None: + self.hotspots = [None] * self.framecount + for i in range(first_frame, self.framecount): + self.hotspots[i] = x, y + + def _frame_index(self, frame=0, dir=None): + ofs = DIR_ORDER.index(DIR_NAMES[dir]) + if ofs >= self.dirs: + ofs = 0 + return frame * self.dirs + ofs + + def get_frame(self, *args, **kwargs): + return self.frames[self._frame_index(*args, **kwargs)] + + +def escape(text): + text = text.replace('\\', '\\\\') + text = text.replace('"', '\\"') + return f'"{text}"' + + +def unescape(text, quote='"'): + if text == 'null': + return None + if not (text.startswith(quote) and text.endswith(quote)): + raise ValueError(text) + text = text[1:-1] + text = text.replace('\\"', '"') + text = text.replace('\\\\', '\\') + return text + + +def parse_num(value): + if '.' in value: + return float(value) + return int(value) + + +def parse_bool(value): + if value not in ('0', '1'): + raise ValueError(value) + return value == '1' \ No newline at end of file diff --git a/tools/dmi/merge_driver.py b/tools/dmi/merge_driver.py new file mode 100644 index 000000000000..56cc541d1a10 --- /dev/null +++ b/tools/dmi/merge_driver.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python3 +import sys +import dmi +from hooks.merge_frontend import MergeDriver + + +def images_equal(left, right): + if left.size != right.size: + return False + w, h = left.size + left_load, right_load = left.load(), right.load() + for y in range(0, h): + for x in range(0, w): + lpixel, rpixel = left_load[x, y], right_load[x, y] + # quietly ignore changes where both pixels are fully transparent + if lpixel != rpixel and (lpixel[3] != 0 or rpixel[3] != 0): + return False + return True + + +def states_equal(left, right): + result = True + + # basic properties + for attr in ('loop', 'rewind', 'movement', 'dirs', 'delays', 'hotspots', 'framecount'): + lval, rval = getattr(left, attr), getattr(right, attr) + if lval != rval: + result = False + + # frames + for (left_frame, right_frame) in zip(left.frames, right.frames): + if not images_equal(left_frame, right_frame): + result = False + + return result + + +def key_of(state): + return (state.name, state.movement) + + +def dictify(sheet): + result = {} + for state in sheet.states: + k = key_of(state) + if k in result: + print(f" duplicate {k!r}") + result[k] = state + return result + + +def three_way_merge(base, left, right): + base_dims = base.width, base.height + if base_dims != (left.width, left.height) or base_dims != (right.width, right.height): + print("Dimensions have changed:") + print(f" Base: {base.width} x {base.height}") + print(f" Ours: {left.width} x {left.height}") + print(f" Theirs: {right.width} x {right.height}") + return True, None + + base_states, left_states, right_states = dictify(base), dictify(left), dictify(right) + + new_left = {k: v for k, v in left_states.items() if k not in base_states} + new_right = {k: v for k, v in right_states.items() if k not in base_states} + new_both = {} + conflicts = [] + for key, state in list(new_left.items()): + in_right = new_right.get(key, None) + if in_right: + if states_equal(state, in_right): + # allow it + new_both[key] = state + else: + # generate conflict states + print(f" C: {state.name!r}: added differently in both!") + state.name = f"{state.name} !CONFLICT! left" + conflicts.append(state) + in_right.name = f"{state.name} !CONFLICT! right" + conflicts.append(in_right) + # don't add it a second time + del new_left[key] + del new_right[key] + + final_states = [] + # add states that are currently in the base + for state in base.states: + in_left = left_states.get(key_of(state), None) + in_right = right_states.get(key_of(state), None) + left_equals = in_left and states_equal(state, in_left) + right_equals = in_right and states_equal(state, in_right) + + if not in_left and not in_right: + # deleted in both left and right, it's just deleted + print(f" {state.name!r}: deleted in both") + elif not in_left: + # left deletes + print(f" {state.name!r}: deleted in left") + if not right_equals: + print(f" ... but modified in right") + final_states.append(in_right) + elif not in_right: + # right deletes + print(f" {state.name!r}: deleted in right") + if not left_equals: + print(f" ... but modified in left") + final_states.append(in_left) + elif left_equals and right_equals: + # changed in neither + #print(f"Same in both: {state.name!r}") + final_states.append(state) + elif left_equals: + # changed only in right + print(f" {state.name!r}: changed in left") + final_states.append(in_right) + elif right_equals: + # changed only in left + print(f" {state.name!r}: changed in right") + final_states.append(in_left) + elif states_equal(in_left, in_right): + # changed in both, to the same thing + print(f" {state.name!r}: changed same in both") + final_states.append(in_left) # either or + else: + # changed in both + name = state.name + print(f" C: {name!r}: changed differently in both!") + state.name = f"{name} !CONFLICT! base" + conflicts.append(state) + in_left.name = f"{name} !CONFLICT! left" + conflicts.append(in_left) + in_right.name = f"{name} !CONFLICT! right" + conflicts.append(in_right) + + # add states which both left and right added the same + for key, state in new_both.items(): + print(f" {state.name!r}: added same in both") + final_states.append(state) + + # add states that are brand-new in the left + for key, state in new_left.items(): + print(f" {state.name!r}: added in left") + final_states.append(state) + + # add states that are brand-new in the right + for key, state in new_right.items(): + print(f" {state.name!r}: added in right") + final_states.append(state) + + final_states.extend(conflicts) + merged = dmi.Dmi(base.width, base.height) + merged.states = final_states + return len(conflicts), merged + + +class DmiDriver(MergeDriver): + driver_id = 'dmi' + + def merge(self, base, left, right): + icon_base = dmi.Dmi.from_file(base) + icon_left = dmi.Dmi.from_file(left) + icon_right = dmi.Dmi.from_file(right) + trouble, merge_result = three_way_merge(icon_base, icon_left, icon_right) + return not trouble, merge_result + + def to_file(self, outfile, merge_result): + merge_result.to_file(outfile) + + def post_announce(self, success, merge_result): + if not success: + print("!!! Manual merge required!") + if merge_result: + print(" A best-effort merge was performed. You must edit the icon and remove all") + print(" icon states marked with !CONFLICT!, leaving only the desired icon.") + else: + print(" The icon was totally unable to be merged, you must start with one version") + print(" or the other and manually resolve the conflict.") + print(" Information about which states conflicted is listed above.") + + +if __name__ == '__main__': + exit(DmiDriver().main()) \ No newline at end of file diff --git a/tools/dmi/test.py b/tools/dmi/test.py new file mode 100644 index 000000000000..1596b4be1e83 --- /dev/null +++ b/tools/dmi/test.py @@ -0,0 +1,39 @@ +import os +import sys +from dmi import * + + +def _self_test(): + # test: can we load every DMI in the tree + count = 0 + for dirpath, dirnames, filenames in os.walk('.'): + if '.git' in dirnames: + dirnames.remove('.git') + for filename in filenames: + if filename.endswith('.dmi'): + fullpath = os.path.join(dirpath, filename) + try: + Dmi.from_file(fullpath) + except Exception: + print('Failed on:', fullpath) + raise + count += 1 + + print(f"{os.path.relpath(__file__)}: successfully parsed {count} .dmi files") + + +def _usage(): + print(f"Usage:") + print(f" tools{os.sep}bootstrap{os.sep}python -m {__spec__.name}") + exit(1) + + +def _main(): + if len(sys.argv) == 1: + return _self_test() + + return _usage() + + +if __name__ == '__main__': + _main() \ No newline at end of file diff --git a/tools/hooks/dmi.merge b/tools/hooks/dmi.merge index 7fd9f171bf07..40e7722c07b6 100755 --- a/tools/hooks/dmi.merge +++ b/tools/hooks/dmi.merge @@ -1,2 +1,2 @@ #!/bin/sh -exec tools/hooks/python.sh -m merge_driver_dmi "$@" +exec tools/bootstrap/python -m dmi.merge_driver "$@" \ No newline at end of file diff --git a/tools/hooks/merge_frontend.py b/tools/hooks/merge_frontend.py new file mode 100644 index 000000000000..4445a5c48548 --- /dev/null +++ b/tools/hooks/merge_frontend.py @@ -0,0 +1,169 @@ +# merge_frontend.py +import sys +import io +import os +import pygit2 +import collections +import typing + + +ENCODING = 'utf-8' + + +class MergeReturn(typing.NamedTuple): + success: bool + merge_result: typing.Optional[object] + + +class MergeDriver: + driver_id: typing.Optional[str] = None + + def pre_announce(self, path: str): + """ + Called before merge() is called, with a human-friendly path for output. + """ + print(f"Merging {self.driver_id}: {path}") + + def merge(self, base: typing.BinaryIO, left: typing.BinaryIO, right: typing.BinaryIO) -> MergeReturn: + """ + Read from three BinaryIOs: base (common ancestor), left (ours), and + right (theirs). Perform the actual three-way merge operation. Leave + conflict markers if necessary. + + Return (False, None) to indicate the merge driver totally failed. + Return (False, merge_result) if the result contains conflict markers. + Return (True, merge_result) if everything went smoothly. + """ + raise NotImplementedError + + def to_file(self, output: typing.BinaryIO, merge_result: object): + """ + Save the merge() result to the given output stream. + Override this if the merge() result is not bytes or str. + """ + if isinstance(merge_result, bytes): + output.write(merge_result) + elif isinstance(merge_result, str): + with io.TextIOWrapper(output, ENCODING) as f: + f.write(merge_result) + else: + raise NotImplementedError + + def post_announce(self, success: bool, merge_result: object): + """ + Called after merge() is called, to warn the user if action is needed. + """ + if not success: + print("!!! Manual merge required") + if merge_result: + print(" A best-effort merge was performed. You must finish the job yourself.") + else: + print(" No merge was possible. You must resolve the conflict yourself.") + + def main(self, args: typing.List[str] = None): + return _main(self, args or sys.argv[1:]) + + +def _main(driver: MergeDriver, args: typing.List[str]): + if len(args) > 0 and args[0] == '--posthoc': + return _posthoc_main(driver, args[1:]) + else: + return _driver_main(driver, args) + + +def _driver_main(driver: MergeDriver, args: typing.List[str]): + """ + Act like a normal Git merge driver, called by Git during a merge. + """ + if len(args) != 5: + print("merge driver called with wrong number of arguments") + print(" usage: %P %O %A %B %L") + return 1 + + path, path_base, path_left, path_right, _ = args + driver.pre_announce(path) + + with open(path_base, 'rb') as io_base: + with open(path_left, 'rb') as io_left: + with open(path_right, 'rb') as io_right: + success, merge_result = driver.merge(io_base, io_left, io_right) + + if merge_result: + # If we got anything, write it to the working directory. + with open(path_left, 'wb') as io_output: + driver.to_file(io_output, merge_result) + + driver.post_announce(success, merge_result) + if not success: + # If we were not successful, do not mark the conflict as resolved. + return 1 + + +def _posthoc_main(driver: MergeDriver, args: typing.List[str]): + """ + Apply merge driver logic to a repository which is already in a conflicted + state, running the driver on any conflicted files. + """ + repo_dir = pygit2.discover_repository(os.getcwd()) + repo = pygit2.Repository(repo_dir) + conflicts = repo.index.conflicts + if not conflicts: + print("There are no unresolved conflicts.") + return 0 + + all_success = True + index_changed = False + any_attempted = False + for base, left, right in list(conflicts): + if not base or not left or not right: + # (not left) or (not right): deleted in one branch, modified in the other. + # (not base): added differently in both branches. + # In either case, there's nothing we can do for now. + continue + + path = left.path + if not _applies_to(repo, driver, path): + # Skip the file if it's not the right extension. + continue + + any_attempted = True + driver.pre_announce(path) + io_base = io.BytesIO(repo[base.id].data) + io_left = io.BytesIO(repo[left.id].data) + io_right = io.BytesIO(repo[right.id].data) + success, merge_result = driver.merge(io_base, io_left, io_right) + if merge_result: + # If we got anything, write it to the working directory. + with open(os.path.join(repo.workdir, path), 'wb') as io_output: + driver.to_file(io_output, merge_result) + + if success: + # If we were successful, mark the conflict as resolved. + with open(os.path.join(repo.workdir, path), 'rb') as io_readback: + contents = io_readback.read() + merged_id = repo.create_blob(contents) + repo.index.add(pygit2.IndexEntry(path, merged_id, left.mode)) + del conflicts[path] + index_changed = True + if not success: + all_success = False + driver.post_announce(success, merge_result) + + if index_changed: + repo.index.write() + + if not any_attempted: + print("There are no unresolved", driver.driver_id, "conflicts.") + + if not all_success: + # Not usually observed, but indicate the failure just in case. + return 1 + + +def _applies_to(repo: pygit2.Repository, driver: MergeDriver, path: str): + """ + Check if the current merge driver is a candidate to handle a given path. + """ + if not driver.driver_id: + raise ValueError('Driver must have ID to perform post-hoc merge') + return repo.get_attr(path, 'merge') == driver.driver_id \ No newline at end of file diff --git a/yogstation.dme b/yogstation.dme index 0c0d3a2198f5..9124c8b5821a 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -179,6 +179,7 @@ #include "code\__DEFINES\dcs\signals\signals_gib.dm" #include "code\__DEFINES\dcs\signals\signals_global.dm" #include "code\__DEFINES\dcs\signals\signals_global_object.dm" +#include "code\__DEFINES\dcs\signals\signals_greyscale.dm" #include "code\__DEFINES\dcs\signals\signals_heretic.dm" #include "code\__DEFINES\dcs\signals\signals_huds.dm" #include "code\__DEFINES\dcs\signals\signals_janitor.dm" @@ -422,6 +423,7 @@ #include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\idlenpcpool.dm" +#include "code\controllers\subsystem\init_profiler.dm" #include "code\controllers\subsystem\input.dm" #include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\job.dm" @@ -447,6 +449,7 @@ #include "code\controllers\subsystem\radio.dm" #include "code\controllers\subsystem\research.dm" #include "code\controllers\subsystem\runechat.dm" +#include "code\controllers\subsystem\security_level.dm" #include "code\controllers\subsystem\server_maint.dm" #include "code\controllers\subsystem\shuttle.dm" #include "code\controllers\subsystem\sounds.dm" @@ -469,6 +472,7 @@ #include "code\controllers\subsystem\processing\antag_hud.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" +#include "code\controllers\subsystem\processing\greyscale.dm" #include "code\controllers\subsystem\processing\instruments.dm" #include "code\controllers\subsystem\processing\nanites.dm" #include "code\controllers\subsystem\processing\networks.dm" @@ -564,6 +568,7 @@ #include "code\datums\brain_damage\split_personality.dm" #include "code\datums\components\_component.dm" #include "code\datums\components\action_item_overlay.dm" +#include "code\datums\components\afterimage.dm" #include "code\datums\components\anti_magic.dm" #include "code\datums\components\armor_plate.dm" #include "code\datums\components\art.dm" @@ -574,6 +579,7 @@ #include "code\datums\components\butchering.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" +#include "code\datums\components\cleave_attack.dm" #include "code\datums\components\connect_containers.dm" #include "code\datums\components\connect_loc_behalf.dm" #include "code\datums\components\connect_mob_behalf.dm" @@ -629,6 +635,7 @@ #include "code\datums\components\spill.dm" #include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" +#include "code\datums\components\squishable.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\summoning.dm" #include "code\datums\components\surgery_bed.dm" @@ -747,8 +754,15 @@ #include "code\datums\elements\turf_transparency.dm" #include "code\datums\elements\undertile.dm" #include "code\datums\elements\update_icon_blocker.dm" +#include "code\datums\elements\update_icon_updates_onmob.dm" #include "code\datums\elements\decals\_decal.dm" #include "code\datums\elements\decals\blood.dm" +#include "code\datums\greyscale\_greyscale_config.dm" +#include "code\datums\greyscale\json_reader.dm" +#include "code\datums\greyscale\layer.dm" +#include "code\datums\greyscale\config_types\greyscale_configs.dm" +#include "code\datums\greyscale\config_types\material_effects.dm" +#include "code\datums\greyscale\config_types\mutant_organ_config.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" @@ -896,6 +910,7 @@ #include "code\datums\wounds\slash.dm" #include "code\datums\wounds\scars\_scars.dm" #include "code\game\alternate_appearance.dm" +#include "code\game\atom_defense.dm" #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\data_huds.dm" @@ -1034,6 +1049,7 @@ #include "code\game\machinery\suit_storage_unit.dm" #include "code\game\machinery\syndicatebeacon.dm" #include "code\game\machinery\syndicatebomb.dm" +#include "code\game\machinery\synth_pod.dm" #include "code\game\machinery\teleporter.dm" #include "code\game\machinery\transformer.dm" #include "code\game\machinery\washing_machine.dm" @@ -1339,6 +1355,8 @@ #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\busterarm\_buster.dm" #include "code\game\objects\items\devices\busterarm\buster_limb.dm" +#include "code\game\objects\items\devices\busterarm\busterharpoon.dm" +#include "code\game\objects\items\devices\busterarm\gasharpoon.dm" #include "code\game\objects\items\devices\busterarm\megabuster.dm" #include "code\game\objects\items\devices\busterarm\wire_snatch.dm" #include "code\game\objects\items\devices\PDA\cart.dm" @@ -1623,6 +1641,7 @@ #include "code\game\turfs\open\floor\plating.dm" #include "code\game\turfs\open\floor\reinf_floor.dm" #include "code\game\turfs\open\floor\plating\asteroid.dm" +#include "code\game\turfs\open\floor\plating\catwalk_plating.dm" #include "code\game\turfs\open\floor\plating\dirt.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" #include "code\game\turfs\open\space\space.dm" @@ -1641,6 +1660,7 @@ #include "code\modules\admin\create_poll.dm" #include "code\modules\admin\create_turf.dm" #include "code\modules\admin\fun_balloon.dm" +#include "code\modules\admin\greyscale_modify_menu.dm" #include "code\modules\admin\holder2.dm" #include "code\modules\admin\ipintel.dm" #include "code\modules\admin\IsBanned.dm" @@ -2141,6 +2161,10 @@ #include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" #include "code\modules\awaymissions\mission_code\vrhub.dm" #include "code\modules\awaymissions\mission_code\wildwest.dm" +#include "code\modules\awaymissions\mission_code\netmin\_puzzles.dm" +#include "code\modules\awaymissions\mission_code\netmin\abandoned_mine.dm" +#include "code\modules\awaymissions\mission_code\netmin\combat_robot_factory.dm" +#include "code\modules\awaymissions\mission_code\netmin\scientist_raid.dm" #include "code\modules\balloon_alert\balloon_alert.dm" #include "code\modules\buildmode\bm_mode.dm" #include "code\modules\buildmode\buildmode.dm" @@ -2184,7 +2208,6 @@ #include "code\modules\cargo\bounties\security.dm" #include "code\modules\cargo\bounties\slime.dm" #include "code\modules\cargo\bounties\special.dm" -#include "code\modules\cargo\bounties\syndicate.dm" #include "code\modules\cargo\bounties\virus.dm" #include "code\modules\cargo\exports\gear.dm" #include "code\modules\cargo\exports\large_objects.dm" @@ -2655,6 +2678,7 @@ #include "code\modules\jobs\job_types\security_officer.dm" #include "code\modules\jobs\job_types\shaft_miner.dm" #include "code\modules\jobs\job_types\station_engineer.dm" +#include "code\modules\jobs\job_types\synthetic.dm" #include "code\modules\jobs\job_types\unassigned.dm" #include "code\modules\jobs\job_types\virologist.dm" #include "code\modules\jobs\job_types\warden.dm" @@ -2896,8 +2920,8 @@ #include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\skeletons.dm" #include "code\modules\mob\living\carbon\human\species_types\snail.dm" -#include "code\modules\mob\living\carbon\human\species_types\synths.dm" #include "code\modules\mob\living\carbon\human\species_types\vampire.dm" +#include "code\modules\mob\living\carbon\human\species_types\wy_synths.dm" #include "code\modules\mob\living\carbon\human\species_types\zombies.dm" #include "code\modules\mob\living\carbon\monkey\combat.dm" #include "code\modules\mob\living\carbon\monkey\death.dm" @@ -2930,29 +2954,35 @@ #include "code\modules\mob\living\silicon\ai\robot_control.dm" #include "code\modules\mob\living\silicon\ai\say.dm" #include "code\modules\mob\living\silicon\ai\vox_sounds.dm" +#include "code\modules\mob\living\silicon\ai\ai_network\ai_network.dm" +#include "code\modules\mob\living\silicon\ai\ai_network\ethernet_cable.dm" +#include "code\modules\mob\living\silicon\ai\ai_network\master_subcontroller.dm" +#include "code\modules\mob\living\silicon\ai\ai_network\networking_machines.dm" +#include "code\modules\mob\living\silicon\ai\ai_network\shared_resources.dm" #include "code\modules\mob\living\silicon\ai\decentralized\_ai_machinery.dm" #include "code\modules\mob\living\silicon\ai\decentralized\ai_core_display.dm" #include "code\modules\mob\living\silicon\ai\decentralized\ai_data_core.dm" -#include "code\modules\mob\living\silicon\ai\decentralized\decentralized_os.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\computer_science_datum.dm" #include "code\modules\mob\living\silicon\ai\decentralized\server_cabinet.dm" -#include "code\modules\mob\living\silicon\ai\decentralized\management\ai_controlpanel.dm" #include "code\modules\mob\living\silicon\ai\decentralized\management\ai_dashboard.dm" #include "code\modules\mob\living\silicon\ai\decentralized\management\ai_server_overview.dm" -#include "code\modules\mob\living\silicon\ai\decentralized\management\resource_distribution.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\_ai_project.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\ai_dab.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\ai_huds.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\projects\ai_translation.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\camera_mobility.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\coolant_manager.dm" -#include "code\modules\mob\living\silicon\ai\decentralized\projects\cryptominer.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\examine.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\firewall.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\induction.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\memory_compressor.dm" -#include "code\modules\mob\living\silicon\ai\decentralized\projects\research_booster.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\rgb.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\projects\room_lockdown.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\self_defense.dm" #include "code\modules\mob\living\silicon\ai\decentralized\projects\surveillance.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\projects\synth_control.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\projects\synths\_synth_project.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\projects\synths\speed_buff.dm" #include "code\modules\mob\living\silicon\ai\decentralized\systech\cpu.dm" #include "code\modules\mob\living\silicon\ai\decentralized\systech\overclocking.dm" #include "code\modules\mob\living\silicon\ai\decentralized\systech\rack.dm" @@ -2961,6 +2991,7 @@ #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" #include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" +#include "code\modules\mob\living\silicon\ai\synthetics\synth_os.dm" #include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\pai.dm" #include "code\modules\mob\living\silicon\pai\pai_defense.dm" @@ -3057,6 +3088,7 @@ #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" #include "code\modules\mob\living\simple_animal\hostile\rat.dm" #include "code\modules\mob\living\simple_animal\hostile\regalrat.dm" +#include "code\modules\mob\living\simple_animal\hostile\robot.dm" #include "code\modules\mob\living\simple_animal\hostile\russian.dm" #include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" #include "code\modules\mob\living\simple_animal\hostile\smspider.dm" @@ -3161,6 +3193,9 @@ #include "code\modules\modular_computers\file_system\programs\radar.dm" #include "code\modules\modular_computers\file_system\programs\robotact.dm" #include "code\modules\modular_computers\file_system\programs\themeify.dm" +#include "code\modules\modular_computers\file_system\programs\ai_network\_ai_network_program.dm" +#include "code\modules\modular_computers\file_system\programs\ai_network\ai_benchmark.dm" +#include "code\modules\modular_computers\file_system\programs\ai_network\ainetworkinterface.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\bomberman.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" @@ -3170,6 +3205,7 @@ #include "code\modules\modular_computers\file_system\programs\command\card.dm" #include "code\modules\modular_computers\file_system\programs\command\crewmanifest.dm" #include "code\modules\modular_computers\file_system\programs\command\jobmanagement.dm" +#include "code\modules\modular_computers\file_system\programs\command\synth_requester.dm" #include "code\modules\modular_computers\file_system\programs\engineering\alarm.dm" #include "code\modules\modular_computers\file_system\programs\engineering\atmosscan.dm" #include "code\modules\modular_computers\file_system\programs\engineering\energyharvestercontrol.dm" @@ -3188,6 +3224,7 @@ #include "code\modules\modular_computers\file_system\programs\supply\cargobounty.dm" #include "code\modules\modular_computers\hardware\_hardware.dm" #include "code\modules\modular_computers\hardware\ai_slot.dm" +#include "code\modules\modular_computers\hardware\aiinterface.dm" #include "code\modules\modular_computers\hardware\battery_module.dm" #include "code\modules\modular_computers\hardware\card_slot.dm" #include "code\modules\modular_computers\hardware\CPU.dm" @@ -3627,7 +3664,6 @@ #include "code\modules\security_levels\keycard_authentication.dm" #include "code\modules\security_levels\level_interface.dm" #include "code\modules\security_levels\security_level_datums.dm" -#include "code\modules\security_levels\security_levels.dm" #include "code\modules\shuttle\ai_ship.dm" #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" @@ -3705,11 +3741,13 @@ #include "code\modules\spells\spell_types\pointed\appendicitis.dm" #include "code\modules\spells\spell_types\pointed\barnyard.dm" #include "code\modules\spells\spell_types\pointed\blind.dm" +#include "code\modules\spells\spell_types\pointed\cast_iron.dm" #include "code\modules\spells\spell_types\pointed\dominate.dm" #include "code\modules\spells\spell_types\pointed\finger_guns.dm" #include "code\modules\spells\spell_types\pointed\fireball.dm" #include "code\modules\spells\spell_types\pointed\lightning_bolt.dm" #include "code\modules\spells\spell_types\pointed\mind_transfer.dm" +#include "code\modules\spells\spell_types\pointed\scrunch.dm" #include "code\modules\spells\spell_types\pointed\spell_cards.dm" #include "code\modules\spells\spell_types\projectile\_basic_projectile.dm" #include "code\modules\spells\spell_types\projectile\juggernaut.dm" @@ -3822,6 +3860,7 @@ #include "code\modules\tgs\includes.dm" #include "code\modules\tgui\external.dm" #include "code\modules\tgui\states.dm" +#include "code\modules\tgui\status_composers.dm" #include "code\modules\tgui\tgui.dm" #include "code\modules\tgui\tgui_window.dm" #include "code\modules\tgui\states\admin.dm" @@ -3842,6 +3881,7 @@ #include "code\modules\tgui\states\observer.dm" #include "code\modules\tgui\states\permissions.dm" #include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\pilot.dm" #include "code\modules\tgui\states\self.dm" #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tgui_input\alert.dm" @@ -3905,7 +3945,11 @@ #include "code\modules\vending\wardrobes.dm" #include "code\modules\vending\youtool.dm" #include "code\modules\visual\render_step.dm" +#include "code\modules\VR\vr_compsci.dm" +#include "code\modules\VR\vr_compsci_artifacts.dm" +#include "code\modules\VR\vr_compsci_missions.dm" #include "code\modules\VR\vr_human.dm" +#include "code\modules\VR\vr_netmin.dm" #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" @@ -3970,6 +4014,7 @@ #include "yogstation\code\datums\mutations\alcohol.dm" #include "yogstation\code\datums\mutations\extendoarm.dm" #include "yogstation\code\datums\ruins\free_miners.dm" +#include "yogstation\code\datums\ruins\jungle_fluff.dm" #include "yogstation\code\datums\ruins\jungle.dm" #include "yogstation\code\datums\ruins\station.dm" #include "yogstation\code\datums\status_effects\buffs.dm" diff --git a/yogstation/code/controllers/subsystem/processing/quirks.dm b/yogstation/code/controllers/subsystem/processing/quirks.dm index 133dba28beaa..0962f462fbde 100644 --- a/yogstation/code/controllers/subsystem/processing/quirks.dm +++ b/yogstation/code/controllers/subsystem/processing/quirks.dm @@ -1,6 +1,6 @@ /datum/controller/subsystem/processing/quirks/proc/checkquirks(mob/living/user,client/cli) // Returns true when the player isn't trying to fuckin scum the mood pref stuff to exploit var/mob/living/carbon/human/U = user - U.mood_enabled = CONFIG_GET(flag/force_human_mood) || cli.prefs.read_preference(/datum/preference/toggle/mood_enabled) // Marks whether this player had moods enabled in preferences at the time of spawning (helps prevent exploitation) + U.mood_enabled = !CONFIG_GET(flag/disable_human_mood) || cli.prefs.read_preference(/datum/preference/toggle/mood_enabled) // Marks whether this player had moods enabled in preferences at the time of spawning (helps prevent exploitation) var/ismoody = (!CONFIG_GET(flag/disable_human_mood) || (cli.prefs.read_preference(/datum/preference/toggle/mood_enabled))) // If moods are globally enabled, or this guy does indeed have his mood pref set to Enabled diff --git a/yogstation/code/datums/components/backstabs.dm b/yogstation/code/datums/components/backstabs.dm index 375c5e036bd1..902c01b77bac 100644 --- a/yogstation/code/datums/components/backstabs.dm +++ b/yogstation/code/datums/components/backstabs.dm @@ -21,6 +21,8 @@ // No bypassing pacifism nerd if(source.force > 0 && HAS_TRAIT(user, TRAIT_PACIFISM) && (source.damtype != STAMINA)) return FALSE + if(source.force > 0 && is_synth(user)) + return FALSE // Same calculation that kinetic crusher uses var/backstab_dir = get_dir(user, living_target) // No backstabbing people if they're already in crit diff --git a/yogstation/code/datums/components/fishable.dm b/yogstation/code/datums/components/fishable.dm index 1f57455cad09..69b2385b560c 100644 --- a/yogstation/code/datums/components/fishable.dm +++ b/yogstation/code/datums/components/fishable.dm @@ -8,7 +8,6 @@ dupe_mode = COMPONENT_DUPE_UNIQUE var/datum/fishing_loot/loot = new /datum/fishing_loot/water - /datum/component/fishable/Initialize() if(!istype(parent, /turf)) return COMPONENT_INCOMPATIBLE @@ -18,7 +17,7 @@ FISHING_LOOT_JUNK = min(max(0,50 - fishing_power),25), FISHING_LOOT_COMMON = min(fishing_power / 5,50), FISHING_LOOT_UNCOMMON = min(fishing_power / 10,33), - FISHING_LOOT_RARE = min(fishing_power / 20,25) + FISHING_LOOT_RARE = min(fishing_power / 20,25) ) var/chosen_rank = pickweight(chance) @@ -33,9 +32,12 @@ return pick(loot.rare_loot) return FISHING_LOOT_NOTHING +//lava fishing -//LOOT TABLES +/datum/component/fishable/lava + loot = new /datum/fishing_loot/lava +//LOOT TABLES /datum/fishing_loot var/list/junk_loot var/list/common_loot @@ -53,7 +55,7 @@ /obj/item/reagent_containers/food/snacks/fish/salmon, /obj/item/reagent_containers/food/snacks/fish/bass, /obj/item/reagent_containers/food/snacks/bait/worm/leech - ) + ) uncommon_loot = list( /obj/item/reagent_containers/food/snacks/fish/goldfish/giant, /obj/item/reagent_containers/food/snacks/fish/shrimp, @@ -67,3 +69,50 @@ /obj/item/clothing/head/soft/fishfear/legendary, /mob/living/simple_animal/hostile/retaliate/gator ) +/datum/fishing_loot/lava + junk_loot = list( + /obj/item/clothing/shoes/workboots/mining, + /obj/item/shovel, + /obj/item/shard, + /obj/item/pickaxe, + /obj/item/stack/sheet/mineral/sandstone, + /obj/item/stack/sheet/mineral/coal + ) + common_loot = list( + /mob/living/simple_animal/hostile/asteroid/gutlunch, + /obj/item/stack/sheet/bone, + /obj/item/stack/sheet/animalhide/goliath_hide, + /obj/item/claymore/ruin, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit + + ) + uncommon_loot = list( + /obj/item/survivalcapsule, + /obj/item/stack/sheet/ruinous_metal, + /obj/item/stack/tile/brass, + /obj/item/stack/sheet/mineral/plasma, + /obj/item/stack/sheet/bluespace_crystal, + /obj/item/clothing/shoes/magboots/syndie, + /obj/item/clothing/head/helmet/chaplain, + /obj/item/clothing/suit/armor/riot/chaplain, + /obj/item/nullrod/claymore, + /obj/item/banner/cargo, + /obj/structure/closet/crate/necropolis, //empty chest its a joke :) + /obj/item/book/manual/ashwalker + + ) + rare_loot = list( + /mob/living/simple_animal/hostile/mining_drone, + /mob/living/simple_animal/hostile/asteroid/goliath, + /obj/item/stack/sheet/mineral/mythril, + /obj/structure/closet/crate/necropolis/tendril, //populated chest + /obj/item/book_of_babel, + /obj/item/bedsheet/cult, + /obj/item/assembly/signaler/anomaly/bluespace, + /obj/item/stack/sheet/mineral/abductor + ) + + \ No newline at end of file diff --git a/yogstation/code/datums/components/storage/storage.dm b/yogstation/code/datums/components/storage/storage.dm index 918f8f805f26..17057beef509 100644 --- a/yogstation/code/datums/components/storage/storage.dm +++ b/yogstation/code/datums/components/storage/storage.dm @@ -23,7 +23,7 @@ UnregisterSignal(parent, COMSIG_TRY_STORAGE_HIDE_ALL) UnregisterSignal(parent, COMSIG_TRY_STORAGE_RETURN_INVENTORY) - UnregisterSignal(parent, COMSIG_PARENT_ATTACKBY) + UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND) UnregisterSignal(parent, COMSIG_ATOM_ATTACK_PAW) diff --git a/yogstation/code/datums/ruins/jungle.dm b/yogstation/code/datums/ruins/jungle.dm index f0b77263e4c6..64c85a9e8fb6 100644 --- a/yogstation/code/datums/ruins/jungle.dm +++ b/yogstation/code/datums/ruins/jungle.dm @@ -60,6 +60,12 @@ description = "A seedvault launched from far away. Thousands of exact copies litter planets across the entire universe, so finding one here isn't too much of a surprise." suffix = "jungleland_jungle_seed_vault.dmm" +/datum/map_template/ruin/jungle/proper/sinden + name = "Den of Sin" + id = "jungle-sinden" + description = "A vile den of sin, run by a demon contracted to make as much profit as possible off everyone planetside." + suffix = "jungleland_jungle_sinden.dmm" + /datum/map_template/ruin/jungle/swamp/cave name = "Cave" id = "jungle-cave" @@ -116,13 +122,14 @@ always_place = TRUE cost = 0 -/datum/map_template/ruin/jungle/all/tar_temple1 - name = "Tar temple 1" - id = "jungle-dying-tar-temple" - description = "Old ruin of a civilization long gone, only echoes of the past remain..." - suffix = "jungleland_dead_tartemple.dmm" +/datum/map_template/ruin/jungle/all/tar_king_phylactery + name = "Tar King's Phylactery" + id = "jungle-tar-king" + description = "In this place lies the core of this world's cancer. \ + Resting deep within the obsidian, sealed under an altar untouched by time, it awaits the day it will finally take form." + suffix = "jungleland_tar_king.dmm" always_place = TRUE - cost = 0 + cost = 0 /datum/map_template/ruin/jungle/all/tar_temple2 name = "Tar temple 2" diff --git a/yogstation/code/datums/ruins/jungle_fluff.dm b/yogstation/code/datums/ruins/jungle_fluff.dm new file mode 100644 index 000000000000..d8471b91b805 --- /dev/null +++ b/yogstation/code/datums/ruins/jungle_fluff.dm @@ -0,0 +1,13 @@ +/obj/item/paper/crumpled/ruins/jungle/tar_king_note + name = "tar-soaked note" + info = {"I'm at the end now.
+Many days and many nights have passed since I left our sanctuary across the isles. +They gave me this crystal, and told me it would be the key to exposing it, the source of our world's cancer.

+ +Now, I see the altar they spoke of, and its misshapen! The lock is too wide, too deep. And there I realized it doesn't fucking fit! +It wasn't a key, it was a SHARD. I risked my life for this! Traveled half the world just for a fucking fragment? And for what? To die here, alone?

+ +This is it. My flask ran dry days ago. I could carry on, but I'm far too weak and too far to go back.
+If any of you find this, I'm so sorry. I failed you all.
+- Welwitschie"} + infolang = /datum/language/sylvan //90% sure this is broken anyways but whatevs diff --git a/yogstation/code/datums/ruins/station.dm b/yogstation/code/datums/ruins/station.dm index 20c2716f1cc4..e5a9d5a66d20 100644 --- a/yogstation/code/datums/ruins/station.dm +++ b/yogstation/code/datums/ruins/station.dm @@ -4,7 +4,6 @@ /datum/map_template/ruin/station/box prefix = "_maps/RandomRuins/StationRuins/BoxStation/" - should_place_on_top = FALSE /datum/map_template/ruin/station/box/engine id = "engine_sm" diff --git a/yogstation/code/datums/world_topic.dm b/yogstation/code/datums/world_topic.dm index 8fc07efea64f..97e34eb09d5e 100644 --- a/yogstation/code/datums/world_topic.dm +++ b/yogstation/code/datums/world_topic.dm @@ -31,6 +31,8 @@ GLOBAL_VAR_INIT(mentornoot, FALSE) var/list/admin_keys = list() for(var/adm in GLOB.permissions.admins) var/client/C = adm + if(isnull(C)) //Yog we're having issues with null holders breaking adminwho, so let's skip nulls + continue if(input["adminchannel"]) admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]" else if(!C.holder.fakekey) diff --git a/yogstation/code/game/gamemodes/battle_royale/battleroyale.dm b/yogstation/code/game/gamemodes/battle_royale/battleroyale.dm index 1810591c78ae..be5e3d95852c 100644 --- a/yogstation/code/game/gamemodes/battle_royale/battleroyale.dm +++ b/yogstation/code/game/gamemodes/battle_royale/battleroyale.dm @@ -152,13 +152,13 @@ GLOBAL_VAR(final_zone) /datum/game_mode/fortnite/proc/shrinkborders() switch(borderstage)//to keep it seperate and not fuck with weather selection if(1) - set_security_level("blue") + SSsecurity_level.set_level(SEC_LEVEL_BLUE) if(4) - set_security_level("red") + SSsecurity_level.set_level(SEC_LEVEL_RED) if(7) - set_security_level("gamma") + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) if(9) - set_security_level("epsilon") + SSsecurity_level.set_level(SEC_LEVEL_EPSILON) var/datum/weather/royale/W switch(borderstage) diff --git a/yogstation/code/game/gamemodes/battle_royale/loot.dm b/yogstation/code/game/gamemodes/battle_royale/loot.dm index 640699b352c7..dff852c2da91 100644 --- a/yogstation/code/game/gamemodes/battle_royale/loot.dm +++ b/yogstation/code/game/gamemodes/battle_royale/loot.dm @@ -90,7 +90,6 @@ GLOBAL_LIST_INIT(battleroyale_armour, list( //weight of 0 - all round good things /obj/item/shield/riot = 0, /obj/item/clothing/suit/armor/elder_atmosian = 0, - /obj/item/clothing/head/det_hat/evil = 0, /obj/item/clothing/suit/space/hardsuit/mining = 0, /obj/item/clothing/suit/armor/bulletproof = 0, /obj/item/clothing/head/helmet/space/pirate = 0, @@ -274,6 +273,7 @@ GLOBAL_LIST_INIT(battleroyale_weapon, list( /obj/item/gun/ballistic/automatic/ar = -5, /obj/item/gun/ballistic/automatic/lwt650 = -5, /obj/item/gun/ballistic/automatic/k41s = -5, + /obj/item/clothing/head/det_hat/evil = -5, //infinite ammo ranged weapon with high dps /obj/item/gun/energy/beam_rifle = -6, /obj/item/gun/ballistic/rifle/sniper_rifle = -6, @@ -411,8 +411,7 @@ GLOBAL_LIST_INIT(battleroyale_utility, list(//bombs, explosives, anything that's /obj/item/autosurgeon/syndicate/spinalspeed = -6, // No opportunity cost speed boost /obj/item/storage/belt/wands/full = -7, //not quite spellbook, but some of these wands are FUCKED - - /obj/item/spellbook = -8, //literally auto-win + /obj/item/spellbook = -7, //literally auto-win IF you have the time to use it (a lot of spells are robe locked too) )) /obj/structure/closet/crate/battleroyale @@ -509,7 +508,7 @@ GLOBAL_LIST_INIT(battleroyale_utility, list(//bombs, explosives, anything that's to_chat(user,span_warning("You already know [user.mind.martial_art.name]!")) return - if(do_after(user, 6 SECONDS, user)) + if(do_after(user, 2 SECONDS, user)) var/datum/martial_art/MA = new martial user.set_species(species) MA.teach(user) diff --git a/yogstation/code/game/gamemodes/darkspawn/darkspawn.dm b/yogstation/code/game/gamemodes/darkspawn/darkspawn.dm index 7877abae56fc..a7387e3b4559 100644 --- a/yogstation/code/game/gamemodes/darkspawn/darkspawn.dm +++ b/yogstation/code/game/gamemodes/darkspawn/darkspawn.dm @@ -13,7 +13,7 @@ required_enemies = 3 recommended_enemies = 3 enemy_minimum_age = 15 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("AI", "Cyborg", "Synthetic") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") //Added Brig Physician title_icon = "ss13" diff --git a/yogstation/code/game/gamemodes/gangs/dominator.dm b/yogstation/code/game/gamemodes/gangs/dominator.dm index 6faa286dc4c5..a547e09c032f 100644 --- a/yogstation/code/game/gamemodes/gangs/dominator.dm +++ b/yogstation/code/game/gamemodes/gangs/dominator.dm @@ -63,7 +63,7 @@ if(gang) dominator_overlay.color = gang.color . += dominator_overlay - if(obj_integrity/max_integrity < 0.66) + if(atom_integrity/max_integrity < 0.66) . += "damage" /obj/machinery/dominator/update_icon_state() @@ -90,7 +90,7 @@ . += span_notice("System on standby.") if(nukedisk) . += span_notice("[nukedisk] seems to be stuck inside.") - . += span_danger("System Integrity: [round((obj_integrity/max_integrity)*100,1)]%") + . += span_danger("System Integrity: [round((atom_integrity/max_integrity)*100,1)]%") /obj/machinery/dominator/process() ..() @@ -138,7 +138,7 @@ /obj/machinery/dominator/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(.) - if(obj_integrity/max_integrity > 0.66) + if(atom_integrity/max_integrity > 0.66) if(prob(damage_amount*2)) spark_system.start() else if(!(stat & BROKEN)) @@ -146,7 +146,8 @@ update_appearance(UPDATE_ICON) -/obj/machinery/dominator/obj_break(damage_flag) +/obj/machinery/dominator/atom_break(damage_flag) + . = ..() if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) set_broken() @@ -242,8 +243,8 @@ if(!was_stranded) priority_announce("All hostile activity within station systems has ceased.","Network Alert") - if(get_security_level() == "delta") - set_security_level("red") + if(SSsecurity_level.get_current_level_as_text() == SEC_LEVEL_DELTA) + SSsecurity_level.set_level(SEC_LEVEL_RED) gang.message_gangtools("Hostile takeover cancelled: Dominator is no longer operational.[gang.dom_attempts ? " You have [gang.dom_attempts] attempt remaining." : " The station network will have likely blocked any more attempts by us."]",1,1) diff --git a/yogstation/code/game/gamemodes/gangs/gangs.dm b/yogstation/code/game/gamemodes/gangs/gangs.dm index 22bc56500ed1..c1cd34e2a966 100644 --- a/yogstation/code/game/gamemodes/gangs/gangs.dm +++ b/yogstation/code/game/gamemodes/gangs/gangs.dm @@ -6,7 +6,7 @@ GLOBAL_LIST_EMPTY(gangs) name = "gang war" config_tag = "gang" antag_flag = ROLE_GANG - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Brig Physician") //Added Brig Physician + restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Brig Physician", "Synthetic") //Added Brig Physician required_players = 35 required_enemies = 1 recommended_enemies = 2 diff --git a/yogstation/code/game/gamemodes/shadowling/shadowling.dm b/yogstation/code/game/gamemodes/shadowling/shadowling.dm index 8c49e5e19ca0..d9c11c590596 100644 --- a/yogstation/code/game/gamemodes/shadowling/shadowling.dm +++ b/yogstation/code/game/gamemodes/shadowling/shadowling.dm @@ -55,7 +55,7 @@ Made by Xhuis required_enemies = 3 recommended_enemies = 3 enemy_minimum_age = 14 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("AI", "Cyborg", "Synthetic") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Brig Physician") title_icon = "ss13" diff --git a/yogstation/code/game/gamemodes/vampire/traitor_vamp.dm b/yogstation/code/game/gamemodes/vampire/traitor_vamp.dm index 19cbcd4ae94d..e70598ac3fbc 100644 --- a/yogstation/code/game/gamemodes/vampire/traitor_vamp.dm +++ b/yogstation/code/game/gamemodes/vampire/traitor_vamp.dm @@ -4,11 +4,12 @@ false_report_weight = 10 traitors_possible = 3 //hard limit on traitors if scaling is turned off restricted_jobs = list("AI", "Cyborg") - required_players = 25 + required_players = 15 required_enemies = 1 // how many of each type are required recommended_enemies = 3 reroll_friendly = 1 + num_modifier = -2 //less traitors to account for the vamps var/list/possible_vampires = list() var/const/vampire_amt = 2 //hard limit on vampires if scaling is turned off var/list/pre_vamps = list() diff --git a/yogstation/code/game/gamemodes/vampire/vampire.dm b/yogstation/code/game/gamemodes/vampire/vampire.dm index fe88cdada4e2..e14a335a21f9 100644 --- a/yogstation/code/game/gamemodes/vampire/vampire.dm +++ b/yogstation/code/game/gamemodes/vampire/vampire.dm @@ -13,7 +13,7 @@ config_tag = "vampire" antag_flag = ROLE_VAMPIRE false_report_weight = 1 - restricted_jobs = list("AI", "Cyborg") + restricted_jobs = list("AI", "Cyborg", "Synthetic") protected_jobs = list("Head of Security", "Captain", "Head of Personnel", "Research Director", "Chief Engineer", "Chief Medical Officer", "Security Officer", "Chaplain", "Detective", "Warden", "Brig Physician") //Added Brig Physician required_players = 15 required_enemies = 1 diff --git a/yogstation/code/game/machinery/telecomms/computers/traffic_control.dm b/yogstation/code/game/machinery/telecomms/computers/traffic_control.dm index b5d4ea19754a..c1ad4605fe15 100644 --- a/yogstation/code/game/machinery/telecomms/computers/traffic_control.dm +++ b/yogstation/code/game/machinery/telecomms/computers/traffic_control.dm @@ -21,10 +21,13 @@ circuit = /obj/item/circuitboard/computer/telecomms/comm_traffic req_access = list(ACCESS_TCOM_ADMIN) + var/unlimited_range = FALSE /obj/machinery/computer/telecomms/traffic/Initialize(mapload) . = ..() GLOB.traffic_comps += src + if(mapload) + unlimited_range = TRUE /obj/machinery/computer/telecomms/traffic/Destroy() GLOB.traffic_comps -= src @@ -223,9 +226,14 @@ temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else - for(var/obj/machinery/telecomms/server/T in range(25, src)) - if(T.network == network) - servers.Add(T) + if(unlimited_range) + for(var/obj/machinery/telecomms/server/T as anything in GLOB.tcomms_servers) + if(T.network == network) + servers.Add(T) + else + for(var/obj/machinery/telecomms/server/T in range(25, src)) + if(T.network == network) + servers.Add(T) if(!servers.len) temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" diff --git a/yogstation/code/game/machinery/telecomms/machines/server.dm b/yogstation/code/game/machinery/telecomms/machines/server.dm index 12cadbe0faf8..fe12c5063815 100644 --- a/yogstation/code/game/machinery/telecomms/machines/server.dm +++ b/yogstation/code/game/machinery/telecomms/machines/server.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_EMPTY(tcomms_servers) + /obj/item/radio/server /obj/item/radio/server/can_receive(frequency,levels) @@ -21,6 +23,11 @@ Compiler = new() Compiler.Holder = src server_radio = new() + GLOB.tcomms_servers += src + . = ..() + +/obj/machinery/telecomms/server/Destroy() + GLOB.tcomms_servers -= src . = ..() /obj/machinery/telecomms/server/proc/update_logs() diff --git a/yogstation/code/game/objects/effects/landmarks.dm b/yogstation/code/game/objects/effects/landmarks.dm index afb45340a277..69d1e7c5e183 100644 --- a/yogstation/code/game/objects/effects/landmarks.dm +++ b/yogstation/code/game/objects/effects/landmarks.dm @@ -60,6 +60,7 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) stack_trace("Station room spawner [src] at ([T.x], [T.y], [T.z]) has a null template.") if(!template_name || template_name == EMPTY_SPAWN) GLOB.stationroom_landmarks -= src + qdel(src) return FALSE GLOB.chosen_station_templates += template_name var/datum/map_template/template = SSmapping.station_room_templates[template_name] @@ -69,7 +70,7 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) template.load(T, centered = FALSE) template.loaded++ GLOB.stationroom_landmarks -= src - //qdel(src) + qdel(src) return TRUE // Proc to allow you to add conditions for choosing templates, instead of just randomly picking from the template list. @@ -91,40 +92,22 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) template_names = current_templates return chosen_template -/obj/effect/landmark/stationroom/box - ///Should this landmark load a template during setup? You might not want to in the case of the chapel or clerk office that uses - ///player preferences to determine which template loads on roundstart - var/load_on_init = TRUE - -/obj/effect/landmark/stationroom/box/load(template_name) - GLOB.stationroom_landmarks -= src - if(!load_on_init) - //don't actually load anything, we're going to do that ourselves - return TRUE - . = ..() - /obj/effect/landmark/stationroom/box/bar - load_on_init = FALSE template_names = list( "Bar Trek", "Bar Spacious", "Bar Box", "Bar Casino", "Bar Citadel", "Bar Conveyor", "Bar Diner", "Bar Disco", "Bar Purple", "Bar Cheese", "Bar Clock", "Bar Arcade") -/obj/effect/landmark/stationroom/box/bar/Initialize(mapload) - . = ..() - GLOB.bar_landmarks += src +/obj/effect/landmark/stationroom/box/bar/load(template_name) + GLOB.stationroom_landmarks -= src + return TRUE /obj/effect/landmark/stationroom/box/clerk - load_on_init = FALSE template_names = list("Clerk Box", "Clerk Pod", "Clerk Meta", "Clerk Gambling Hall") -/obj/effect/landmark/stationroom/box/clerk/Initialize(mapload) - . = ..() - GLOB.clerk_office_landmarks += src - -// /obj/effect/landmark/stationroom/box/clerk/load(template_name) -// GLOB.stationroom_landmarks -= src -// return TRUE +/obj/effect/landmark/stationroom/box/clerk/load(template_name) + GLOB.stationroom_landmarks -= src + return TRUE /obj/effect/landmark/stationroom/box/engine template_names = list("Engine SM" = 40, "Engine Singulo And Tesla" = 20, "Engine Nuclear Reactor" = 20,"Engine TEG" = 20) @@ -161,19 +144,14 @@ GLOBAL_LIST_EMPTY(chosen_station_templates) template_names = list("Transfer 1", "Transfer 2", "Transfer 3", "Transfer 4", "Transfer 5", "Transfer 6", "Transfer 7", "Transfer 8", "Transfer 9", "Transfer 10") /obj/effect/landmark/stationroom/box/chapel - load_on_init = FALSE template_names = list("Chapel 1", "Chapel 2") -/obj/effect/landmark/stationroom/box/chapel/Initialize(mapload) - . = ..() - GLOB.chapel_landmarks += src - -// /obj/effect/landmark/stationroom/box/chapel/load(template_name) -// GLOB.stationroom_landmarks -= src -// return TRUE +/obj/effect/landmark/stationroom/box/chapel/load(template_name) + GLOB.stationroom_landmarks -= src + return TRUE /obj/effect/landmark/stationroom/meta/engine - template_names = list("Meta SM" = 25, "Meta Nuclear Reactor" = 45, "Meta TEG" = 25) // tesla is loud as fuck and singulo doesn't make sense, so SM/reactor only + template_names = list("Meta SM" = 45, "Meta Nuclear Reactor" = 30, "Meta TEG" = 25) // tesla is loud as fuck and singulo doesn't make sense, so SM/reactor only /obj/effect/landmark/stationroom/meta/engine/choose() . = ..() diff --git a/yogstation/code/game/objects/items/devices/PDA/PDA_types.dm b/yogstation/code/game/objects/items/devices/PDA/PDA_types.dm index db7b25682297..935d444e14b5 100644 --- a/yogstation/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/yogstation/code/game/objects/items/devices/PDA/PDA_types.dm @@ -1,23 +1,23 @@ /obj/item/pda/network_admin - name = "telecomms PDA" + name = "\improper antique telecomms PDA" default_cartridge = /obj/item/cartridge/signal icon_state = "pda_tcomms" light_color = LIGHT_COLOR_ORANGE /obj/item/pda/para - name = "paramedic PDA" + name = "\improper antique paramedic PDA" default_cartridge = /obj/item/cartridge/paramedic icon_state = "pda-medical" light_color = LIGHT_COLOR_LIGHT_CYAN /obj/item/pda/miningmed - name = "mining medic PDA" + name = "\improper antique mining medic PDA" default_cartridge = /obj/item/cartridge/medical icon_state = "pda-miningmed" light_color = LIGHT_COLOR_LIGHT_CYAN /obj/item/pda/physician - name = "brig physician PDA" + name = "\improper antique brig physician PDA" default_cartridge = /obj/item/cartridge/medical icon_state = "pda-physician" light_color = LIGHT_COLOR_RED diff --git a/yogstation/code/game/objects/items/fishing/bait.dm b/yogstation/code/game/objects/items/fishing/bait.dm index 54e4abf3d3f8..d0c64df32657 100644 --- a/yogstation/code/game/objects/items/fishing/bait.dm +++ b/yogstation/code/game/objects/items/fishing/bait.dm @@ -1,6 +1,6 @@ /obj/item/reagent_containers/food/snacks/bait name = "development bait" - desc = "if you see this, get help" + desc = "If you see this, get help." icon = 'yogstation/icons/obj/fishing/fishing.dmi' icon_state = "bait_worm" tastes = list("sour, rotten water" = 1) diff --git a/yogstation/code/game/objects/items/fryingpan.dm b/yogstation/code/game/objects/items/fryingpan.dm index 713456831d22..1ab09be3a910 100644 --- a/yogstation/code/game/objects/items/fryingpan.dm +++ b/yogstation/code/game/objects/items/fryingpan.dm @@ -54,8 +54,7 @@ statue.name = "bananium plated [statue.name]" statue.desc = "An incredibly lifelike bananium carving." statue.add_atom_colour("#ffd700", FIXED_COLOUR_PRIORITY) - statue.max_integrity = 9999 - statue.obj_integrity = 9999 + statue.modify_max_integrity(9999, can_break=FALSE) return ..() /obj/item/melee/fryingpan/bananium/honk_act() diff --git a/yogstation/code/game/objects/items/implants/implant_teleporter.dm b/yogstation/code/game/objects/items/implants/implant_teleporter.dm index 9cabcb3d96ca..6a4aab7397a8 100644 --- a/yogstation/code/game/objects/items/implants/implant_teleporter.dm +++ b/yogstation/code/game/objects/items/implants/implant_teleporter.dm @@ -6,6 +6,8 @@ var/useblacklist = TRUE var/on = FALSE var/retrievalmessage = "Retrieval complete." + var/punishment = FALSE + var/punishment_damage = 0 /obj/item/implant/teleporter/Initialize(mapload) START_PROCESSING(SSobj, src) @@ -49,6 +51,8 @@ if(!is_centcom_level(T.z)) do_teleport(imp_in, pointofreturn, 0, channel = TELEPORT_CHANNEL_WORMHOLE) say(retrievalmessage) + if(punishment == TRUE) + imp_in.adjustFireLoss(punishment_damage) /obj/item/implant/teleporter/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) LAZYINITLIST(target.implants) @@ -107,3 +111,10 @@ pointofreturn = /area/ruin/powered/inn usewhitelist = TRUE retrievalmessage = "Safety retrieval complete." + +/obj/item/implant/teleporter/demon + pointofreturn = /area/ruin/powered/sinden + usewhitelist = TRUE + punishment = TRUE + punishment_damage = 50 + retrievalmessage = "You think you can just abandon your contract?" diff --git a/yogstation/code/game/objects/items/tools.dm b/yogstation/code/game/objects/items/tools.dm index 477c5ff547be..318ecf491089 100644 --- a/yogstation/code/game/objects/items/tools.dm +++ b/yogstation/code/game/objects/items/tools.dm @@ -118,6 +118,9 @@ if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm [M]!")) return + if(!synth_check(user, SYNTH_ORGANIC_HARM)) + to_chat(user, span_warning("You don't want to harm [M]!")) + return if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) M = user return eyestab(M,user) diff --git a/yogstation/code/game/objects/items/wielded/big_spoon.dm b/yogstation/code/game/objects/items/wielded/big_spoon.dm index 107bce062e96..d6f0ad40c6ca 100644 --- a/yogstation/code/game/objects/items/wielded/big_spoon.dm +++ b/yogstation/code/game/objects/items/wielded/big_spoon.dm @@ -28,6 +28,7 @@ wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ ) + AddComponent(/datum/component/cleave_attack, requires_wielded=TRUE, no_multi_hit=TRUE) /obj/item/bigspoon/proc/on_wield(atom/source, mob/living/user) hitsound = 'yogstation/sound/weapons/bat_hit.ogg' diff --git a/yogstation/code/game/objects/items/wielded/sledgehammer.dm b/yogstation/code/game/objects/items/wielded/sledgehammer.dm index 9101954a7a3d..750a91ccf359 100644 --- a/yogstation/code/game/objects/items/wielded/sledgehammer.dm +++ b/yogstation/code/game/objects/items/wielded/sledgehammer.dm @@ -33,6 +33,11 @@ require_twohands = TRUE, \ wielded_stats = list(SWING_SPEED = 1.5, ENCUMBRANCE = 0.5, ENCUMBRANCE_TIME = 1 SECONDS, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0), \ ) + AddComponent(/datum/component/cleave_attack, \ + arc_size=180, \ + requires_wielded=TRUE, \ + no_multi_hit=TRUE, \ + ) // big and heavy hammer makes wide arc /obj/item/melee/sledgehammer/proc/on_wield(atom/source, mob/living/user) hitsound = "swing_hit" @@ -50,11 +55,12 @@ if(!proximity_flag) return - if(isstructure(target) || ismachinery(target)) + if(target.uses_integrity) if(!QDELETED(target)) - var/obj/structure/S = target - if(istype(S, /obj/structure/window)) // Sledgehammer really good at smashing windows. 2-7 hits to kill a window - S.take_damage(S.max_integrity/2, BRUTE, MELEE, FALSE, null, armour_penetration) + if(istype(target, /obj/structure/window)) // Sledgehammer really good at smashing windows. 2-7 hits to kill a window + target.take_damage(target.max_integrity/2, BRUTE, MELEE, FALSE, null, armour_penetration) + if(iswallturf(target)) + target.take_damage(force * demolition_mod, BRUTE, MELEE, FALSE, null, armour_penetration) // Sledgehammers are quite good at smashing walls playsound(src, 'sound/effects/bang.ogg', 50, 1) /obj/item/melee/sledgehammer/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, quickstart) diff --git a/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm index b5e709874d34..dcdf2f921549 100644 --- a/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm +++ b/yogstation/code/game/objects/items/wielded/vxtvulhammer.dm @@ -46,6 +46,11 @@ force_wielded = force_wielded, \ unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ ) + AddComponent(/datum/component/cleave_attack, \ + arc_size=180, \ + requires_wielded=TRUE, \ + cleave_end_callback=CALLBACK(src, PROC_REF(end_swing)), \ + ) /obj/item/melee/vxtvulhammer/Destroy() //Even though the hammer won't probably be destroyed, Ever™ QDEL_NULL(spark_system) @@ -70,6 +75,10 @@ user.visible_message(span_warning("[user] flicks the hammer off!")) charging = FALSE +/obj/item/melee/vxtvulhammer/proc/end_swing(obj/item/weapon, mob/user) + if(supercharged) + supercharge() + /obj/item/melee/vxtvulhammer/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(attack_type == PROJECTILE_ATTACK || !HAS_TRAIT(src, TRAIT_WIELDED)) //Doesn't work against ranged or if it's not wielded final_block_chance = 0 //Please show me how you can block a bullet with an industrial hammer I would LOVE to see it @@ -143,39 +152,26 @@ K.color = color playsound(loc, 'sound/effects/powerhammerhit.ogg', 80, FALSE) //Mainly this sound playsound(loc, 'sound/effects/explosion3.ogg', 20, TRUE) //Bit of a reverb - supercharge() //At start so it doesn't give an unintentional message if you hit yourself + if(!HAS_TRAIT(src, TRAIT_CLEAVING)) // wait for the swing to end + supercharge() //At start so it doesn't give an unintentional message if you hit yourself - if(ismachinery(target) && !toy) - var/obj/machinery/machine = target - machine.take_damage(machine.max_integrity * 2) //Should destroy machines in one hit - if(istype(target, /obj/machinery/door)) + if(ismecha(target) && !toy) + user.visible_message(span_danger("The hammer thunders against [target], caving in part of its outer plating!")) + target.take_damage(target.max_integrity/3, damtype, MELEE, FALSE, null, armour_penetration) + + else if(target.uses_integrity && !toy) + user.visible_message(span_danger("The hammer thunders against [target], demolishing it!"), blind_message=span_hear("You hear thunder.")) + target.atom_destruction(damtype) + if(ismachinery(target)) for(var/obj/structure/door_assembly/door in target_turf) //Will destroy airlock assembly left behind, but drop the parts door.take_damage(door.max_integrity * 2) - else for(var/obj/structure/frame/base in target_turf) //Will destroy machine or computer frame left behind, but drop the parts base.take_damage(base.max_integrity * 2) for(var/obj/structure/light_construct/light in target_turf) //Also light frames because why not light.take_damage(light.max_integrity * 2) - user.visible_message(span_danger("The hammer thunders against the [target.name], demolishing it!")) - - else if(isstructure(target) && !toy) - var/obj/structure/struct = target - struct.take_damage(struct.max_integrity * 2) //Destroy structures in one hit too if(istype(target, /obj/structure/table)) for(var/obj/structure/table_frame/platform in target_turf) platform.take_damage(platform.max_integrity * 2) //Destroys table frames left behind - user.visible_message(span_danger("The hammer thunders against the [target.name], destroying it!")) - - else if(iswallturf(target) && !toy) - var/turf/closed/wall/fort = target - fort.dismantle_wall(1) //Deletes the wall but drop the materials, just like destroying a machine above - user.visible_message(span_danger("The hammer thunders against the [target.name], shattering it!")) - playsound(loc, 'sound/effects/meteorimpact.ogg', 50, TRUE) //Otherwise there's no sound for hitting the wall, since it's just dismantled - - else if(ismecha(target) && !toy) - var/obj/mecha/mech = target - mech.take_damage(mech.max_integrity/3) //A third of its max health is dealt as an untyped damage, in addition to the normal damage of the weapon (which has high AP) - user.visible_message(span_danger("The hammer thunders as it massively dents the plating of the [target.name]!")) else if(isliving(target)) var/atom/throw_target = get_edge_target_turf(target, user.dir) diff --git a/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm b/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm index a516fed1e226..76a5945595f7 100644 --- a/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm +++ b/yogstation/code/game/objects/structures/bar_stuff/bar_stuff.dm @@ -76,4 +76,3 @@ turf/open/floor/plasteel/ameridiner name = "slot machine" desc = "Gambling for the antisocial." icon = 'yogstation/icons/obj/special_slot_machine.dmi' - icon_state = "slots1" diff --git a/yogstation/code/game/objects/structures/fireaxe.dm b/yogstation/code/game/objects/structures/fireaxe.dm index 782a1d697575..c70ab3751551 100644 --- a/yogstation/code/game/objects/structures/fireaxe.dm +++ b/yogstation/code/game/objects/structures/fireaxe.dm @@ -30,7 +30,7 @@ return ..() /obj/structure/fireaxecabinet/proc/check_deconstruct(obj/item/I, mob/user) - if(istype(I, /obj/item/wrench) && !(flags_1 & NODECONSTRUCT_1) && !fireaxe && (open || broken || obj_integrity >= max_integrity)) + if(istype(I, /obj/item/wrench) && !(flags_1 & NODECONSTRUCT_1) && !fireaxe && (open || broken || atom_integrity >= max_integrity)) //User is attempting to wrench an open/broken fireaxe cabinet with NO fireaxe in it user.visible_message(span_warning("[user] disassembles the [name]."), \ "You start to disassemble the [name]...", \ diff --git a/yogstation/code/game/world.dm b/yogstation/code/game/world.dm index 19f4643c9869..d678208817ea 100644 --- a/yogstation/code/game/world.dm +++ b/yogstation/code/game/world.dm @@ -40,9 +40,9 @@ GLOBAL_LIST_EMPTY(donators) var/s = "" var/server_name = CONFIG_GET(string/servername) if (server_name) - s += "[server_name]\] — Dive in Now: Perfect for Beginners!" - s += "
99% Lag-Free MRP Experience! Join the Adventure!" - s += "
Time: [gameTimestamp("hh:mm")] | Map: [SSmapping?.config?.map_name || "Unknown"] | Alert: [capitalize(get_security_level())]" + s += "[server_name]\] — Dive in Now: Perfect for Beginners!" + s += "
99% Lag-Free | Regular Events | Active Community" + s += "
Time: [gameTimestamp("hh:mm")] | Map: [SSmapping?.config?.map_name || "Unknown"] | Alert: [capitalize(SSsecurity_level.get_current_level_as_text())]" s += "
\[Website" // link to our website so they can join forums + discord from here //As of October 27th, 2023 taglines.txt is no longer used in the status because we never had the characters to spare it, so it would put 2-3 random characters at the end and look bad. diff --git a/yogstation/code/modules/antagonists/blob/blob/blobs/core.dm b/yogstation/code/modules/antagonists/blob/blob/blobs/core.dm index 3d0cae270729..f4a71e4d6d06 100644 --- a/yogstation/code/modules/antagonists/blob/blob/blobs/core.dm +++ b/yogstation/code/modules/antagonists/blob/blob/blobs/core.dm @@ -1,5 +1,5 @@ /obj/structure/blob/core/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0, overmind_reagent_trigger = 1) . = ..() - if(obj_integrity > 0) + if(atom_integrity > 0) if(overmind) //we should have an overmind, but... to_chat(overmind, span_userdanger("Your core is under attack!")) diff --git a/yogstation/code/modules/antagonists/darkspawn/darkspawn.dm b/yogstation/code/modules/antagonists/darkspawn/darkspawn.dm index cabb30efe47c..71929e7a87f6 100644 --- a/yogstation/code/modules/antagonists/darkspawn/darkspawn.dm +++ b/yogstation/code/modules/antagonists/darkspawn/darkspawn.dm @@ -354,7 +354,7 @@ /datum/antagonist/darkspawn/proc/sacrament() var/mob/living/carbon/human/user = owner.current if(!SSticker.mode.sacrament_done) - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) addtimer(CALLBACK(src, PROC_REF(sacrament_shuttle_call)), 50) for(var/V in abilities) remove_ability(abilities[V], TRUE) diff --git a/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/psionic_barrier.dm b/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/psionic_barrier.dm index 281aab20764d..da12b75b8c62 100644 --- a/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/psionic_barrier.dm +++ b/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/psionic_barrier.dm @@ -2,7 +2,6 @@ /obj/structure/psionic_barrier name = "psionic barrier" desc = "Shimmering violet particles dancing in the air. They're impossible to move past." - obj_integrity = 200 max_integrity = 200 icon = 'icons/effects/effects.dmi' icon_state = "purplesparkles" @@ -21,7 +20,7 @@ QDEL_IN(src, time) /obj/structure/psionic_barrier/Destroy() - if(!obj_integrity) + if(!atom_integrity) visible_message(span_warning("[src] vanishes in a burst of violet energy!")) playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 50, TRUE) new/obj/effect/temp_visual/revenant/cracks(get_turf(src)) @@ -29,4 +28,4 @@ return ..() /obj/structure/psionic_barrier/process() - obj_integrity = max(0, min(max_integrity, obj_integrity + 1)) + update_integrity(max(0, min(max_integrity, atom_integrity + 1))) diff --git a/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/simulacrum.dm b/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/simulacrum.dm index 07eeda0ce750..1334b50eb7f4 100644 --- a/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/simulacrum.dm +++ b/yogstation/code/modules/antagonists/darkspawn/darkspawn_objects/simulacrum.dm @@ -4,7 +4,8 @@ desc = "What are you hiding?!" icon_state = "static" density = TRUE - obj_integrity = 25 + uses_integrity = TRUE + max_integrity = 25 var/mob/living/mimicking /obj/effect/simulacrum/Initialize(mapload) diff --git a/yogstation/code/modules/antagonists/gang/gang.dm b/yogstation/code/modules/antagonists/gang/gang.dm index 7aba5234418a..d125285519a8 100644 --- a/yogstation/code/modules/antagonists/gang/gang.dm +++ b/yogstation/code/modules/antagonists/gang/gang.dm @@ -514,7 +514,7 @@ /datum/team/gang/proc/domination() domination_time = world.time + determine_domination_time()*10 - set_security_level("delta") + SSsecurity_level.set_level(SEC_LEVEL_DELTA) /datum/team/gang/proc/determine_domination_time() // calculates the value in seconds (this is the initial domination time!) var/total_territories = total_claimable_territories() diff --git a/yogstation/code/modules/antagonists/infiltrator/outfit.dm b/yogstation/code/modules/antagonists/infiltrator/outfit.dm index b5060a1ee3a9..fd1041e4c7e2 100644 --- a/yogstation/code/modules/antagonists/infiltrator/outfit.dm +++ b/yogstation/code/modules/antagonists/infiltrator/outfit.dm @@ -1,4 +1,4 @@ -/datum/outfit/infiltrator +/datum/outfit/infiltrator // RIP name = "Syndicate Infiltrator" uniform = /obj/item/clothing/under/chameleon/syndicate @@ -8,9 +8,9 @@ ears = /obj/item/radio/headset/chameleon/syndicate id = /obj/item/card/id/syndicate mask = /obj/item/clothing/mask/chameleon/syndicate - belt = /obj/item/pda/chameleon/syndicate - backpack_contents = list(/obj/item/storage/box/engineer=1,\ - /obj/item/kitchen/knife/combat/survival=1,\ + belt = /obj/item/modular_computer/tablet/pda/preset/syndicate + box = /obj/item/storage/box/survival/engineer + backpack_contents = list(/obj/item/kitchen/knife/combat/survival=1,\ /obj/item/gun/ballistic/automatic/pistol=1) /datum/outfit/infiltrator/post_equip(mob/living/carbon/human/H) diff --git a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm index e76c1369df92..191d4c687865 100644 --- a/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm +++ b/yogstation/code/modules/antagonists/shadowling/special_shadowling_abilities.dm @@ -205,7 +205,7 @@ H.invisibility = 60 //This is pretty bad, but is also necessary for the shuttle call to function properly H.forceMove(A) if(!SSticker.mode.shadowling_ascended) - set_security_level(SEC_LEVEL_GAMMA) + SSsecurity_level.set_level(SEC_LEVEL_GAMMA) SSshuttle.emergency_call_time = 1800 SSshuttle.emergency.request(null, 0.3) SSshuttle.emergency_no_recall = TRUE diff --git a/yogstation/code/modules/clothing/gloves/miscellaneous.dm b/yogstation/code/modules/clothing/gloves/miscellaneous.dm index 076f56947d07..f30b0e6b7063 100644 --- a/yogstation/code/modules/clothing/gloves/miscellaneous.dm +++ b/yogstation/code/modules/clothing/gloves/miscellaneous.dm @@ -9,8 +9,8 @@ armor = list(melee = 35, bullet = 50, laser = 45, energy = 30, bomb = 50, bio = 50, rad = 40) /obj/item/clothing/gloves/yogs/army - desc = "Gloves often seen used by military folk. These gloves are fire-resistant." name = "military gloves" + desc = "Gloves often seen used by military folk. These gloves are fire-resistant." icon_state = "armygloves" item_state = "armygloves" cold_protection = HANDS @@ -20,12 +20,12 @@ resistance_flags = NONE /obj/item/clothing/gloves/yogs/namgloves - desc = "nam gloves to help show people just exactly what war is good for." name = "nam gloves" + desc = "Nam gloves to help show people just exactly what war is good for." icon_state = "namgloves" item_state = "namgloves" 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 \ No newline at end of file + resistance_flags = NONE diff --git a/yogstation/code/modules/clothing/head/misc.dm b/yogstation/code/modules/clothing/head/misc.dm index 16af86af9c32..bfb6fa7996aa 100644 --- a/yogstation/code/modules/clothing/head/misc.dm +++ b/yogstation/code/modules/clothing/head/misc.dm @@ -56,6 +56,7 @@ worn_x_dimension = 64 worn_y_dimension = 64 resistance_flags = FLAMMABLE + clothing_flags = LARGE_WORN_ICON /obj/item/clothing/head/yogs/goatpope/equipped(mob/living/carbon/human/user, slot) ..() diff --git a/yogstation/code/modules/clothing/suits/armor.dm b/yogstation/code/modules/clothing/suits/armor.dm index 6877bd5e8e12..ba67ea89f6eb 100644 --- a/yogstation/code/modules/clothing/suits/armor.dm +++ b/yogstation/code/modules/clothing/suits/armor.dm @@ -55,7 +55,7 @@ /obj/item/clothing/suit/armor/vest/hosjacket name = "head of security jacket" - desc = "all the style of a jacket with all the protection of a armor vest!" + desc = "All the style of a jacket with all the protection of a armor vest!" mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi' icon = 'yogstation/icons/obj/clothing/suits.dmi' icon_state = "hos_jacket" @@ -63,7 +63,7 @@ /obj/item/clothing/suit/armor/vest/wardenjacket name = "warden's black jacket" - desc = "all the style of a jacket with all the protection of a armor vest!" + desc = "All the style of a jacket with all the protection of a armor vest!" mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi' icon = 'yogstation/icons/obj/clothing/suits.dmi' icon_state = "warden_jacket" @@ -71,7 +71,7 @@ /obj/item/clothing/suit/armor/hos/germancoat name = "padded german coat" - desc = "for those cold german winters or for those head of securitys that want to show their true colors." + desc = "For those cold german winters or those heads of security that want to show their true colors." mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi' icon = 'yogstation/icons/obj/clothing/suits.dmi' icon_state = "german_coat" diff --git a/yogstation/code/modules/clothing/suits/labcoat.dm b/yogstation/code/modules/clothing/suits/labcoat.dm index 594b408aad1d..e4afdff8b7e0 100644 --- a/yogstation/code/modules/clothing/suits/labcoat.dm +++ b/yogstation/code/modules/clothing/suits/labcoat.dm @@ -2,13 +2,13 @@ /obj/item/clothing/suit/toggle/labcoat/emt/explorer name = "mining medic's jacket" desc = "A protective jacket for medical emergencies on off-world planets. Has MM embossed into it." - armor = list(melee = 10, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50) + armor = list(MELEE = 25, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, WOUND = 10) allowed = list(/obj/item/analyzer,/obj/item/multitool/tricorder,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/autoinjector,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/melee/classic_baton/telescopic,/obj/item/soap,/obj/item/sensor_device,/obj/item/tank/internals, /obj/item/hypospray) /obj/item/clothing/suit/toggle/labcoat/explorer name = "mining medic's labcoat" desc = "A protective labcoat for medical emergencies on off-world planets." - armor = list(melee = 10, bullet = 10, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0, fire = 50, acid = 50) + armor = list(MELEE = 25, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, WOUND = 10) allowed = list(/obj/item/analyzer,/obj/item/multitool/tricorder,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/autoinjector,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/melee/classic_baton/telescopic,/obj/item/soap,/obj/item/sensor_device,/obj/item/tank/internals, /obj/item/hypospray) mob_overlay_icon = 'yogstation/icons/mob/clothing/suit/suit.dmi' icon_state = "labcoat_mining" diff --git a/yogstation/code/modules/clothing/suits/miscellaneous.dm b/yogstation/code/modules/clothing/suits/miscellaneous.dm index 5bf739e57c9f..ce8501efe69c 100644 --- a/yogstation/code/modules/clothing/suits/miscellaneous.dm +++ b/yogstation/code/modules/clothing/suits/miscellaneous.dm @@ -365,7 +365,7 @@ /obj/item/clothing/head/hooded/winterhood/northern name = "northern hat" - desc = "only this, and nothing more." + desc = "Only this, and nothing more." icon_state = "northern" item_state = "northern" diff --git a/yogstation/code/modules/clothing/under/jobs/civilian.dm b/yogstation/code/modules/clothing/under/jobs/civilian.dm index 7778dc455761..127028c6f74d 100644 --- a/yogstation/code/modules/clothing/under/jobs/civilian.dm +++ b/yogstation/code/modules/clothing/under/jobs/civilian.dm @@ -27,8 +27,8 @@ name = "recovery medic's jumpsuit" icon_state = "recovery" item_state = "recovery" - can_adjust = 0 + can_adjust = FALSE sensor_mode = 3 - random_sensor = 0 - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 15, rad = 0) + random_sensor = FALSE + armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 15, RAD = 0, FIRE = 80, ACID = 0, WOUND = 10) mutantrace_variation = MUTANTRACE_VARIATION diff --git a/yogstation/code/modules/clothing/under/miscellaneous.dm b/yogstation/code/modules/clothing/under/miscellaneous.dm index 2de468450e1f..e0949e2a878f 100644 --- a/yogstation/code/modules/clothing/under/miscellaneous.dm +++ b/yogstation/code/modules/clothing/under/miscellaneous.dm @@ -566,3 +566,11 @@ icon_state = "cosby" item_state = "cosby" can_adjust = 0 + +/obj/item/clothing/under/yogs/hawaiian_skirt + name = "hawaiian skirt" + desc = "A traditional hawaiian skirt, often called a pa'u." + icon_state = "hawaiian_skirt" + item_state = "hawaiian_skirt" + fitted = FEMALE_UNIFORM_TOP //no hole in the skirt + can_adjust = 0 diff --git a/yogstation/code/modules/crafting/recipes.dm b/yogstation/code/modules/crafting/recipes.dm index cf8f4785e9f7..ccc26308afef 100644 --- a/yogstation/code/modules/crafting/recipes.dm +++ b/yogstation/code/modules/crafting/recipes.dm @@ -118,3 +118,23 @@ ) tool_paths = list(/obj/item/weldingtool) category = CAT_STRUCTURES + +/datum/crafting_recipe/pinapolantern + name = "Pinap-o'-Lantern" + result = /obj/item/clothing/under/yogs/hawaiian_skirt + time = 2 SECONDS + reqs = list ( + /obj/item/reagent_containers/food/snacks/grown/pineapple = 1, + /obj/item/flashlight/lantern = 1 + ) + category = CAT_MISC + +/datum/crafting_recipe/hawaiian_skirt + name = "Hawaiian Skirt" + result = /obj/item/clothing/under/yogs/hawaiian_skirt + time = 2 SECONDS + reqs = list ( + /obj/item/reagent_containers/food/snacks/grown/coconut = 1, + /obj/item/reagent_containers/food/snacks/grown/grass = 1 + ) + category = CAT_CLOTHING diff --git a/yogstation/code/modules/guardian/abilities/major/explosive.dm b/yogstation/code/modules/guardian/abilities/major/explosive.dm index bfac5e5dfad5..1f9bc887801c 100644 --- a/yogstation/code/modules/guardian/abilities/major/explosive.dm +++ b/yogstation/code/modules/guardian/abilities/major/explosive.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_INIT(guardian_bomb_life, list( action_types = list(/datum/action/guardian/detonate_bomb) var/bomb_cooldown = 0 var/list/bombs = list() - var/static/list/boom_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND) + var/static/list/boom_signals = list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND) /datum/guardian_ability/major/explosive/Attack(atom/target) if (prob(40) && isliving(target)) @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(guardian_bomb_life, list( var/picked_bomb = input(user, "Pick which bomb to detonate", "Detonate Bomb") as null|anything in ability.bombs if (picked_bomb) ability.bombs -= picked_bomb - UnregisterSignal(picked_bomb, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND)); + UnregisterSignal(picked_bomb, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND)); UnregisterSignal(picked_bomb, COMSIG_ATOM_EXAMINE); log_bomber(user, "detonated a", picked_bomb) explosion(picked_bomb, -1, 1, 1, 1) diff --git a/yogstation/code/modules/guardian/abilities/major/healing.dm b/yogstation/code/modules/guardian/abilities/major/healing.dm index 1683af8a48fb..571f7b995681 100644 --- a/yogstation/code/modules/guardian/abilities/major/healing.dm +++ b/yogstation/code/modules/guardian/abilities/major/healing.dm @@ -40,12 +40,11 @@ guardian.med_hud_set_health() guardian.med_hud_set_status() return TRUE - else if (isobj(target)) - var/obj/O = target - guardian.do_attack_animation(O) - O.obj_integrity = min(O.obj_integrity + (O.max_integrity * 0.1), O.max_integrity) - var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(O)) - O.update_appearance(UPDATE_ICON) + else if (target.uses_integrity) + guardian.do_attack_animation(target) + target.update_integrity(min(target.get_integrity() + (target.max_integrity * 0.1), target.max_integrity)) + var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(target)) + target.update_appearance(UPDATE_ICON) if (guardian.namedatum) H.color = guardian.namedatum.color guardian.changeNext_move(CLICK_CD_MELEE) diff --git a/yogstation/code/modules/jobs/job_types/brig_physician.dm b/yogstation/code/modules/jobs/job_types/brig_physician.dm index e3d0bdf1eef4..21b06511b92c 100644 --- a/yogstation/code/modules/jobs/job_types/brig_physician.dm +++ b/yogstation/code/modules/jobs/job_types/brig_physician.dm @@ -7,7 +7,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the chief medical officer" - selection_color = "#d4ebf2" minimal_player_age = 5 //seriously stop griefing exp_requirements = 100 exp_type = EXP_TYPE_CREW @@ -47,7 +46,7 @@ name = "Brig Physician" jobtype = /datum/job/brigphysician - pda_type = /obj/item/modular_computer/tablet/pda/preset/paramed + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/paramed backpack_contents = list(/obj/item/roller = 1) belt = /obj/item/storage/belt/medical @@ -55,7 +54,7 @@ glasses = /obj/item/clothing/glasses/hud/health/sunglasses shoes = /obj/item/clothing/shoes/jackboots digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/jackboots - uniform = /obj/item/clothing/under/yogs/rank/miner/medic + uniform = /obj/item/clothing/under/yogs/rank/physician/white uniform_skirt = /obj/item/clothing/under/yogs/rank/physician/white/skirt suit = /obj/item/clothing/suit/toggle/labcoat/emt/physician l_hand = /obj/item/storage/firstaid/regular @@ -65,6 +64,5 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med - box = /obj/item/storage/box/survival implants = list(/obj/item/implant/mindshield) diff --git a/yogstation/code/modules/jobs/job_types/clerk.dm b/yogstation/code/modules/jobs/job_types/clerk.dm index d7d9a2d4a114..230ee6c051ef 100644 --- a/yogstation/code/modules/jobs/job_types/clerk.dm +++ b/yogstation/code/modules/jobs/job_types/clerk.dm @@ -7,7 +7,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" - selection_color = "#dddddd" added_access = list() base_access = list(ACCESS_MANUFACTURING) alt_titles = list("Salesman", "Gift Shop Attendent", "Retail Worker") diff --git a/yogstation/code/modules/jobs/job_types/mining_medic.dm b/yogstation/code/modules/jobs/job_types/mining_medic.dm index 326c26a014f5..ffb8aad57cf4 100644 --- a/yogstation/code/modules/jobs/job_types/mining_medic.dm +++ b/yogstation/code/modules/jobs/job_types/mining_medic.dm @@ -7,7 +7,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the chief medical officer and the quartermaster" - selection_color = "#d4ebf2" minimal_player_age = 4 exp_requirements = 120 exp_type = EXP_TYPE_CREW @@ -23,6 +22,10 @@ /datum/job_department/medical, /datum/job_department/cargo, ) + + minimal_lightup_areas = list( + /area/construction/mining/aux_base + ) //if it's skeleton there's probably no paramedic to save spaced miners that jaunted away from danger added_access = list(ACCESS_SURGERY, ACCESS_CARGO, ACCESS_CLONING, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS) @@ -43,7 +46,7 @@ name = "Mining Medic" jobtype = /datum/job/miningmedic - pda_type = /obj/item/modular_computer/tablet/pda/preset/paramed + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/paramed backpack_contents = list(/obj/item/roller = 1,\ /obj/item/kitchen/knife/combat/survival = 1,\ @@ -64,5 +67,5 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med - box = /obj/item/storage/box/survival_mining + box = /obj/item/storage/box/survival/mining pda_slot = ITEM_SLOT_LPOCKET diff --git a/yogstation/code/modules/jobs/job_types/network_admin.dm b/yogstation/code/modules/jobs/job_types/network_admin.dm index b84aac807a57..d6bc0919d314 100644 --- a/yogstation/code/modules/jobs/job_types/network_admin.dm +++ b/yogstation/code/modules/jobs/job_types/network_admin.dm @@ -7,7 +7,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the chief engineer and research director" - selection_color = "#fff5cc" exp_requirements = 180 exp_type = EXP_TYPE_CREW alt_titles = list("AI Tech Support", "SysOp") @@ -15,9 +14,9 @@ outfit = /datum/outfit/job/network_admin added_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS) - base_access = list(ACCESS_TCOMSAT, ACCESS_TCOM_ADMIN, ACCESS_TECH_STORAGE, ACCESS_RC_ANNOUNCE, ACCESS_CONSTRUCTION, ACCESS_MECH_ENGINE, ACCESS_NETWORK, ACCESS_RESEARCH, ACCESS_MINISAT, ACCESS_RND) + base_access = list(ACCESS_TCOMSAT, ACCESS_TCOM_ADMIN, ACCESS_TECH_STORAGE, ACCESS_RC_ANNOUNCE, ACCESS_CONSTRUCTION, ACCESS_MECH_ENGINE, ACCESS_NETWORK, ACCESS_RESEARCH, ACCESS_MINISAT, ACCESS_RND, ACCESS_TOX) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_ENG + paycheck_department = ACCOUNT_SCI display_order = JOB_DISPLAY_ORDER_NETWORK_ADMIN minimal_character_age = 22 //Feasibly same level as engineer, mostly a data engineer instead of a mechanical or construction-based one, though is still capable of making certain machines @@ -37,8 +36,9 @@ name = "Network Admin" jobtype = /datum/job/network_admin - pda_type = /obj/item/modular_computer/tablet/pda/preset/basic + pda_type = /obj/item/modular_computer/tablet/pda/preset/network_admin + l_hand = /obj/item/modular_computer/laptop/preset/network_admin belt = /obj/item/storage/belt/utility/full/engi ears = /obj/item/radio/headset/headset_network uniform = /obj/item/clothing/under/yogs/rank/network_admin @@ -47,11 +47,10 @@ gloves = /obj/item/clothing/gloves/color/black shoes = /obj/item/clothing/shoes/workboots digitigrade_shoes = /obj/item/clothing/shoes/xeno_wraps/engineering - backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering - box = /obj/item/storage/box/engineer + box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET diff --git a/yogstation/code/modules/jobs/job_types/paramedic.dm b/yogstation/code/modules/jobs/job_types/paramedic.dm index 9f8d3fbd6cfb..dd9e41ecd697 100644 --- a/yogstation/code/modules/jobs/job_types/paramedic.dm +++ b/yogstation/code/modules/jobs/job_types/paramedic.dm @@ -7,7 +7,6 @@ total_positions = 3 spawn_positions = 2 supervisors = "the chief medical officer" - selection_color = "#d4ebf2" alt_titles = list("EMT", "Paramedic Trainee", "Rapid Response Medic", "Space Search & Rescue") outfit = /datum/outfit/job/paramedic @@ -44,7 +43,7 @@ name = "Paramedic" jobtype = /datum/job/paramedic - pda_type = /obj/item/modular_computer/tablet/pda/preset/paramed + pda_type = /obj/item/modular_computer/tablet/pda/preset/medical/paramed backpack_contents = list(/obj/item/storage/firstaid/regular) ears = /obj/item/radio/headset/headset_med diff --git a/yogstation/code/modules/jobs/job_types/psychiatrist.dm b/yogstation/code/modules/jobs/job_types/psychiatrist.dm index 0fac1c0868ab..b7487fc5ea68 100644 --- a/yogstation/code/modules/jobs/job_types/psychiatrist.dm +++ b/yogstation/code/modules/jobs/job_types/psychiatrist.dm @@ -7,7 +7,6 @@ total_positions = 1 spawn_positions = 1 supervisors = "the chief medical officer" - selection_color = "#d4ebf2" alt_titles = list("Counsellor", "Therapist", "Mentalist") minimal_player_age = 5 //stop griefing diff --git a/yogstation/code/modules/jobs/job_types/tourist.dm b/yogstation/code/modules/jobs/job_types/tourist.dm index d5ebb5c1e177..ba5aab4c8fd1 100644 --- a/yogstation/code/modules/jobs/job_types/tourist.dm +++ b/yogstation/code/modules/jobs/job_types/tourist.dm @@ -6,7 +6,6 @@ total_positions = -1 spawn_positions = 0 supervisors = "the head of personnel" - selection_color = "#dddddd" added_access = list() base_access = list() alt_titles = list("Visitor", "Traveler", "Siteseer", "Fisher") diff --git a/yogstation/code/modules/jungleland/ghost_role_spawners.dm b/yogstation/code/modules/jungleland/ghost_role_spawners.dm index d5121959f4e7..7298935e07bc 100644 --- a/yogstation/code/modules/jungleland/ghost_role_spawners.dm +++ b/yogstation/code/modules/jungleland/ghost_role_spawners.dm @@ -101,3 +101,40 @@ resistance_flags = NONE armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 0, FIRE = 80, ACID = 50, ELECTRIC = 100) enabled_areas = list(/area/ruin/powered/syndicate_lava_base) + +/obj/effect/mob_spawn/human/greedydemon + name = "Red Sleeper" + desc = "An ancient sleeper that could possibly not even be man made, housing a raging hell fire." + roundstart = FALSE + death = FALSE + random = TRUE + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper_s" + short_desc = "You are a hellish demon of greed, posted on a house of sin and gambling." + flavour_text = "Attract patrons to your terrible home, make cash, and prepare any facilities that are needed. Make sure your guests feel welcome, it is the best way to tempt them. In addition, do not give things away for free, everything has a price after all." + important_info = "Do not leave your establishment if possible, and do not leave the planet at all." + outfit = /datum/outfit/greedydemon + assignedrole = "Greedy Demon" + id_access_list = list(ACCESS_BAR,ACCESS_KITCHEN,ACCESS_HYDROPONICS) + +/obj/effect/mob_spawn/human/greedydemon/special(mob/living/new_spawn) + var/datum/antagonist/sinfuldemon/demon = new + demon.demonsin = "greed" + new_spawn.mind.add_antag_datum(demon) + demon.greet() + message_admins("[ADMIN_LOOKUPFLW(new_spawn)] has been made into a Sinful Demon by a ghost spawner.") + log_game("[key_name(new_spawn)] was spawned as a Sinful Demon by a ghost spawner.") + +/datum/outfit/greedydemon + name = "Greedy Demon" + uniform = /obj/item/clothing/under/suit_jacket/really_black + head = /obj/item/clothing/head/that + back = /obj/item/storage/backpack + suit = /obj/item/clothing/suit/armor/vest + mask = /obj/item/clothing/mask/cigarette/pipe + shoes = /obj/item/clothing/shoes/laceup + glasses = /obj/item/clothing/glasses/sunglasses/reagent + gloves = /obj/item/clothing/gloves/color/white + ears = /obj/item/radio/headset + id = /obj/item/card/id + implants = list(/obj/item/implant/teleporter/demon) //stay at your den of sin diff --git a/yogstation/code/modules/jungleland/jungle_items.dm b/yogstation/code/modules/jungleland/jungle_items.dm index 96d1cc3b3d7a..a21d9c8b1da5 100644 --- a/yogstation/code/modules/jungleland/jungle_items.dm +++ b/yogstation/code/modules/jungleland/jungle_items.dm @@ -574,7 +574,8 @@ var/damage_bonus = 0 var/cooldown_bonus = 0 var/current_state = 0 - var/timer = 0 + COOLDOWN_DECLARE(bonus_timer) + var/bonus_cooldown = 5 SECONDS /obj/item/crusher_trophy/jungleland/corrupted_dryad_branch/effect_desc() return "Gives a stacking (up to 5 times) decreases your shot delay and increases detonation damage when you detonate a mark. Lasts 5 seconds, extending on successful mark detonation. Missing resets the stacks." @@ -593,8 +594,7 @@ STOP_PROCESSING(SSprocessing,src) /obj/item/crusher_trophy/jungleland/corrupted_dryad_branch/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/hammer_synced) - . = ..() - timer = 5 SECONDS + COOLDOWN_START(src, bonus_timer, bonus_cooldown) var/previous_state = current_state current_state = min(current_state + 1, 5) cooldown_bonus = 2 * current_state @@ -609,17 +609,15 @@ hammer_synced = loc user = hammer_synced.loc hammer_synced.detonation_damage -= damage_bonus - hammer_synced.charge_time -= cooldown_bonus + hammer_synced.charge_time += cooldown_bonus current_state = 0 cooldown_bonus = 0 damage_bonus = 0 user.clear_alert("glory_of_victory") /obj/item/crusher_trophy/jungleland/corrupted_dryad_branch/process(delta_time) - if(timer > 0) - timer -= delta_time - if(timer <= 0) - remove_bonuses() + if(COOLDOWN_FINISHED(src, bonus_timer)) + remove_bonuses() /obj/item/crusher_trophy/jungleland/mosquito_sack name = "Mosquito's bloodsack" diff --git a/yogstation/code/modules/jungleland/jungle_megafauna.dm b/yogstation/code/modules/jungleland/jungle_megafauna.dm index 0fd04488714f..bae38e3db2ce 100644 --- a/yogstation/code/modules/jungleland/jungle_megafauna.dm +++ b/yogstation/code/modules/jungleland/jungle_megafauna.dm @@ -352,6 +352,10 @@ /obj/effect/better_animated_temp_visual/tar_king_chaser_impale/Initialize(mapload, new_caster) . = ..() caster = new_caster + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) INVOKE_ASYNC(src, PROC_REF(blast)) /obj/effect/better_animated_temp_visual/tar_king_chaser_impale/proc/blast() @@ -365,8 +369,7 @@ sleep(0.1 SECONDS) bursting = FALSE -/obj/effect/better_animated_temp_visual/tar_king_chaser_impale/Crossed(atom/movable/AM) - ..() +/obj/effect/better_animated_temp_visual/tar_king_chaser_impale/proc/on_entered(datum/source, atom/movable/AM, ...) if(bursting) do_damage(get_turf(src)) diff --git a/yogstation/code/modules/jungleland/jungle_mobs.dm b/yogstation/code/modules/jungleland/jungle_mobs.dm index ea09f493b87c..147e4d8ec847 100644 --- a/yogstation/code/modules/jungleland/jungle_mobs.dm +++ b/yogstation/code/modules/jungleland/jungle_mobs.dm @@ -178,8 +178,8 @@ response_help = "pets" response_disarm = "gently pushes aside" response_harm = "hits" - maxHealth = 320 - health = 320 + maxHealth = 285 + health = 285 spacewalk = TRUE melee_damage_lower = 30 melee_damage_upper = 55 // ouch diff --git a/yogstation/code/modules/jungleland/jungle_turfs.dm b/yogstation/code/modules/jungleland/jungle_turfs.dm index 5404c7cfcaab..3b458852234e 100644 --- a/yogstation/code/modules/jungleland/jungle_turfs.dm +++ b/yogstation/code/modules/jungleland/jungle_turfs.dm @@ -55,6 +55,10 @@ Temperature: 126.85 °C (400 K) /area/jungleland/dying_forest name = "Dying Jungle" +/area/ruin/powered/sinden + name = "Den of Sin" + icon_state = "dk_yellow" + /turf/open/floor/plating/dirt/jungleland name = "generic jungle land turf" desc = "pain" diff --git a/yogstation/code/modules/jungleland/kinetic_javelin.dm b/yogstation/code/modules/jungleland/kinetic_javelin.dm index 1c48c6d4305d..d20f0be812a2 100644 --- a/yogstation/code/modules/jungleland/kinetic_javelin.dm +++ b/yogstation/code/modules/jungleland/kinetic_javelin.dm @@ -23,7 +23,7 @@ /obj/item/kinetic_javelin name = "kinetic javelin" - desc = "powerful thrown weapon best suited to exotic environments. It has a small piece of bluespace lodged inside of it's shaft, hitting a living being while in an exotic environment teleports it straight back to you." + desc = "Powerful thrown weapon best suited to exotic environments. It has a small piece of bluespace lodged inside of it's shaft, hitting a living being while in an exotic environment teleports it straight back to you." icon = 'yogstation/icons/obj/kinetic_javelin.dmi' lefthand_file = 'yogstation/icons/mob/inhands/lefthand.dmi' righthand_file = 'yogstation/icons/mob/inhands/righthand.dmi' diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm index 3cff062abfbc..f13418885c8c 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm @@ -10,6 +10,7 @@ default_features = list("mcolor" = "#00FF00", "pod_hair" = "Cabbage", "pod_flower" = "Cabbage") rare_say_mod = list("rustles" = 10) attack_verb = "slash" + attack_effect = ATTACK_EFFECT_CLAW attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' burnmod = 2 @@ -57,6 +58,9 @@ C.faction -= "plants" C.faction -= "vines" +/datum/species/pod/get_butt_sprite() + return BUTT_SPRITE_FLOWERPOT + /datum/species/pod/spec_life(mob/living/carbon/human/H) if(H.stat == DEAD || H.stat == UNCONSCIOUS || (H.mind && H.mind.has_antag_datum(ANTAG_DATUM_THRALL))) return diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index 590e174bc205..17884cebb570 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -13,6 +13,7 @@ high_threshold_cleared = span_info("Your Preternis eyes have recharged enough to re-enable most functionality.") low_threshold_cleared = span_info("Your Preternis eyes have almost fully recharged.") actions_types = list(/datum/action/item_action/organ_action/use) + var/original_eye_color var/powered = TRUE var/night_vision = FALSE // This list is used as the color cutoff for the night vision @@ -20,36 +21,69 @@ // This variable is the actual night vision strength var/light_cutoff = LIGHTING_CUTOFF_HIGH +/obj/item/organ/eyes/robotic/preternis/Insert(mob/living/carbon/M, special, drop_if_replaced, initialising) + . = ..() + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + original_eye_color = H.eye_color + +/obj/item/organ/eyes/robotic/preternis/Remove(mob/living/carbon/M, special) + nv_off() + . = ..() + /obj/item/organ/eyes/robotic/preternis/ui_action_click() - if(damage > low_threshold) - //no nightvision if your eyes are hurt + if(damage > low_threshold || (powered && owner.nutrition <= NUTRITION_LEVEL_HUNGRY)) + //no nightvision if your eyes are low on power, whether internal or external return - sight_flags = initial(sight_flags) - night_vision = !night_vision if (night_vision) - color_cutoffs = colour_cutoff_list.Copy() - lighting_cutoff = light_cutoff + nv_off() else - color_cutoffs = null - lighting_cutoff = null + nv_on() + +/obj/item/organ/eyes/robotic/preternis/proc/nv_on() + night_vision = TRUE + color_cutoffs = colour_cutoff_list.Copy() + lighting_cutoff = light_cutoff + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + original_eye_color = H.eye_color + H.eye_color = "#8b60ff" + H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) + H.update_body() + owner.update_sight() + +/obj/item/organ/eyes/robotic/preternis/proc/nv_off() + night_vision = FALSE + color_cutoffs = null + lighting_cutoff = null + if(ishuman(owner) && original_eye_color) + var/mob/living/carbon/human/H = owner + H.eye_color = original_eye_color + H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK) + H.update_body() owner.update_sight() /obj/item/organ/eyes/robotic/preternis/on_life() . = ..() if(!owner) return - if((owner.mob_biotypes & MOB_ROBOTIC) && !powered) + if((HAS_TRAIT(owner, TRAIT_POWERHUNGRY) || (owner.mob_biotypes & MOB_ROBOTIC)) && !powered) powered = TRUE to_chat(owner, span_notice("A battery icon disappears from your vision as your [src] switch to external power.")) - if(!(owner.mob_biotypes & MOB_ROBOTIC) && powered) //these eyes depend on being inside a preternis for power + if(!(HAS_TRAIT(owner, TRAIT_POWERHUNGRY) || (owner.mob_biotypes & MOB_ROBOTIC)) && powered) //these eyes depend on being inside a preternis for power powered = FALSE to_chat(owner, span_boldwarning("Your [src] flash warnings that they've lost their power source, and are running on emergency power!")) if(powered) //when powered, they recharge by healing owner.adjustOrganLoss(ORGAN_SLOT_EYES,-0.5) - else - //to simulate running out of power, they take damage - owner.adjustOrganLoss(ORGAN_SLOT_EYES,0.5) + if(night_vision) + owner.adjust_nutrition(-1) //consumes power to stay charged + if(owner.nutrition <= NUTRITION_LEVEL_HUNGRY) + nv_off() //if low on power, turn off + else if(night_vision) + owner.adjustOrganLoss(ORGAN_SLOT_EYES,0.5) //to simulate running out of power, they take damage + if(damage > low_threshold) + nv_off() //if low on power, turn off /obj/item/organ/eyes/robotic/preternis/examine(mob/user) . = ..() diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index b3c28f653baf..55c973b7dbc4 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -1,5 +1,5 @@ -/datum/species/preternis/proc/drain_power_from(mob/living/carbon/human/H, atom/A) +/datum/species/proc/drain_power_from(mob/living/carbon/human/H, atom/A) if(!istype(H) || !A) return @@ -31,7 +31,7 @@ draining = FALSE return - var/blocked = H.getarmor(H.held_index_to_body_zone(H.active_hand_index), ELECTRIC) + var/blocked = H.getarmor(H.held_index_to_hand(H.active_hand_index), ELECTRIC) siemens_coefficient *= (100 - blocked) / 100 if(blocked >= 100) to_chat(H, span_info("NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.")) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 8070ed0ce3e6..f96935341968 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -59,7 +59,6 @@ var/lockdown = FALSE var/eating_msg_cooldown = FALSE var/emag_lvl = 0 - var/draining = FALSE var/soggy = FALSE var/low_power_warning = FALSE diff --git a/yogstation/code/modules/ninja/suit/ninja.dm b/yogstation/code/modules/ninja/suit/ninja.dm index 1e754cc4ce48..794382753fbc 100644 --- a/yogstation/code/modules/ninja/suit/ninja.dm +++ b/yogstation/code/modules/ninja/suit/ninja.dm @@ -28,14 +28,14 @@ var/lights_colour = "16be00" /obj/item/clothing/suit/space/space_ninja/worn_overlays(isinhands = FALSE) - .=..() + . = ..() if(!isinhands && lights_on) var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay") M.color = lights_colour . += M /obj/item/clothing/mask/gas/space_ninja/worn_overlays(isinhands = FALSE) - .=..() + . = ..() if(!isinhands && lights_on) var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay") M.color = lights_colour @@ -43,14 +43,14 @@ /obj/item/clothing/shoes/space_ninja/worn_overlays(isinhands = FALSE) - .=..() + . = ..() if(!isinhands && lights_on) var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay") M.color = lights_colour . += M /obj/item/clothing/gloves/space_ninja/worn_overlays(isinhands = FALSE) - .=..() + . = ..() if(!isinhands && lights_on) var/mutable_appearance/M = mutable_appearance(mob_overlay_icon, "s-ninja-overlay") M.color = lights_colour @@ -64,7 +64,7 @@ to_chat(H, "[span_userdanger("ERROR")]: 10453 UNABLE TO LOCATE FACE MASK\nABORTING...") return FALSE - .=..() + . = ..() if(.) n_mask = H.wear_mask ADD_TRAIT(n_mask, TRAIT_NODROP, NINJA_SUIT_TRAIT) diff --git a/yogstation/code/modules/ruins/ivymen_den.dm b/yogstation/code/modules/ruins/ivymen_den.dm index 96e862f270af..f0158a24a890 100644 --- a/yogstation/code/modules/ruins/ivymen_den.dm +++ b/yogstation/code/modules/ruins/ivymen_den.dm @@ -47,7 +47,7 @@ else meat_counter++ H.gib() - obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tree + update_integrity(min(atom_integrity + max_integrity * 0.05, max_integrity)) //restores 5% hp of tree for(var/mob/living/L in view(src, 5)) if(L.mind?.has_antag_datum(/datum/antagonist/ivymen)) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "oogabooga", /datum/mood_event/sacrifice_good) diff --git a/yogstation/code/modules/spacepods/equipment.dm b/yogstation/code/modules/spacepods/equipment.dm index 37ea7cd2fb6b..844f3617c95a 100644 --- a/yogstation/code/modules/spacepods/equipment.dm +++ b/yogstation/code/modules/spacepods/equipment.dm @@ -291,11 +291,11 @@ /obj/item/spacepod_equipment/lock/on_install(obj/spacepod/SP) ..() - RegisterSignal(SP, COMSIG_PARENT_ATTACKBY, PROC_REF(spacepod_attackby)) + RegisterSignal(SP, COMSIG_ATOM_ATTACKBY, PROC_REF(spacepod_attackby)) SP.lock = src /obj/item/spacepod_equipment/lock/on_uninstall() - UnregisterSignal(spacepod, COMSIG_PARENT_ATTACKBY) + UnregisterSignal(spacepod, COMSIG_ATOM_ATTACKBY) if(spacepod.lock == src) spacepod.lock = null spacepod.locked = FALSE diff --git a/yogstation/code/modules/spacepods/prebuilt.dm b/yogstation/code/modules/spacepods/prebuilt.dm index a834b32c0fd8..db6c6ee9ee4b 100644 --- a/yogstation/code/modules/spacepods/prebuilt.dm +++ b/yogstation/code/modules/spacepods/prebuilt.dm @@ -60,5 +60,5 @@ internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) velocity_x = rand(-3, 3) velocity_y = rand(-3, 3) - obj_integrity = rand(100, max_integrity) + update_integrity(rand(100, max_integrity)) brakes = FALSE diff --git a/yogstation/code/modules/spacepods/spacepod.dm b/yogstation/code/modules/spacepods/spacepod.dm index 56a33745d3d9..a9aa7a13d297 100644 --- a/yogstation/code/modules/spacepods/spacepod.dm +++ b/yogstation/code/modules/spacepods/spacepod.dm @@ -157,17 +157,17 @@ GLOBAL_LIST_INIT(spacepods_list, list()) to_chat(user, span_notice("Turn the [L] on first.")) return TRUE if(W.tool_behaviour == TOOL_WELDER) - var/repairing = cell || internal_tank || equipment.len || (obj_integrity < max_integrity) || pilot || passengers.len + var/repairing = cell || internal_tank || equipment.len || (atom_integrity < max_integrity) || pilot || passengers.len if(!hatch_open) to_chat(user, span_warning("You must open the maintenance hatch before [repairing ? "attempting repairs" : "unwelding the armor"].")) return TRUE - if(repairing && obj_integrity >= max_integrity) + if(repairing && atom_integrity >= max_integrity) to_chat(user, span_warning("[src] is fully repaired!")) return TRUE to_chat(user, span_notice("You start [repairing ? "repairing [src]" : "slicing off [src]'s armor'"]")) if(W.use_tool(src, user, 50, amount=3, volume = 50)) if(repairing) - obj_integrity = min(max_integrity, obj_integrity + 10) + update_integrity(min(max_integrity, atom_integrity + 10)) update_appearance(UPDATE_ICON) to_chat(user, span_notice("You mend some [pick("dents","bumps","damage")] with [W]")) else if(!cell && !internal_tank && !equipment.len && !pilot && !passengers.len && construction_state == SPACEPOD_ARMOR_WELDED) @@ -233,13 +233,13 @@ GLOBAL_LIST_INIT(spacepods_list, list()) /obj/spacepod/proc/add_armor(obj/item/pod_parts/armor/armor) desc = armor.pod_desc max_integrity = armor.pod_integrity - obj_integrity = max_integrity - integrity_failure + obj_integrity + update_integrity(max_integrity - integrity_failure + atom_integrity) pod_armor = armor update_appearance(UPDATE_ICON) /obj/spacepod/proc/remove_armor() if(!pod_armor) - obj_integrity = min(integrity_failure, obj_integrity) + update_integrity(min(integrity_failure, atom_integrity)) max_integrity = integrity_failure desc = initial(desc) pod_armor = null @@ -299,7 +299,7 @@ GLOBAL_LIST_INIT(spacepods_list, list()) var/obj/spacepod/S = loc . += "" . += "Spacepod Charge: [S.cell ? "[round(S.cell.charge,0.1)]/[S.cell.maxcharge] KJ" : "NONE"]" - . += "Spacepod Integrity: [round(S.obj_integrity,0.1)]/[S.max_integrity]" + . += "Spacepod Integrity: [round(S.get_integrity(),0.1)]/[S.max_integrity]" . += "Spacepod Velocity: [round(sqrt(S.velocity_x*S.velocity_x+S.velocity_y*S.velocity_y), 0.1)] m/s" . += "" @@ -315,8 +315,9 @@ GLOBAL_LIST_INIT(spacepods_list, list()) if(prob(40)) take_damage(40, BRUTE, BOMB, 0) -/obj/spacepod/obj_break() - if(obj_integrity <= 0) +/obj/spacepod/atom_break() + . = ..() + if(atom_integrity <= 0) return // nah we'll let the other boy handle it if(construction_state < SPACEPOD_ARMOR_LOOSE) return @@ -422,9 +423,9 @@ GLOBAL_LIST_INIT(spacepods_list, list()) . += masked_armor return - if(obj_integrity <= max_integrity / 2) + if(atom_integrity <= max_integrity / 2) . += image(icon='goon/icons/obj/spacepods/2x2.dmi', icon_state="pod_damage") - if(obj_integrity <= max_integrity / 4) + if(atom_integrity <= max_integrity / 4) . += image(icon='goon/icons/obj/spacepods/2x2.dmi', icon_state="pod_fire") if(weapon && weapon.overlay_icon_state) diff --git a/yogstation/code/modules/vending/gift.dm b/yogstation/code/modules/vending/gift.dm index 596fdd4cd1cf..a08225e21103 100644 --- a/yogstation/code/modules/vending/gift.dm +++ b/yogstation/code/modules/vending/gift.dm @@ -62,7 +62,7 @@ /obj/item/flashlight/flare/signal = 1, /obj/item/storage/toolbox/mechanical = 1, /obj/item/stack/cable_coil/random = 4, - /obj/item/pda = 8, + /obj/item/pda = 8, //Keeping these so the clerk can still sell their amazing "antique PDAs" /obj/item/cartridge/engineering = 2, /obj/item/cartridge/atmos = 2, /obj/item/cartridge/medical = 2, diff --git a/yogstation/icons/mob/clothing/uniform/uniform.dmi b/yogstation/icons/mob/clothing/uniform/uniform.dmi index 07a8b03ffef5..28873ee41e52 100644 Binary files a/yogstation/icons/mob/clothing/uniform/uniform.dmi and b/yogstation/icons/mob/clothing/uniform/uniform.dmi differ diff --git a/yogstation/icons/obj/clothing/uniforms.dmi b/yogstation/icons/obj/clothing/uniforms.dmi index 37fe5b3845a2..8cba3615fc90 100644 Binary files a/yogstation/icons/obj/clothing/uniforms.dmi and b/yogstation/icons/obj/clothing/uniforms.dmi differ diff --git a/yogstation/icons/obj/items.dmi b/yogstation/icons/obj/items.dmi index 760a72ade1c9..4e7f7ea14b07 100644 Binary files a/yogstation/icons/obj/items.dmi and b/yogstation/icons/obj/items.dmi differ diff --git a/yogstation/icons/obj/special_slot_machine.dmi b/yogstation/icons/obj/special_slot_machine.dmi index b61bee707844..235e0236c9b0 100644 Binary files a/yogstation/icons/obj/special_slot_machine.dmi and b/yogstation/icons/obj/special_slot_machine.dmi differ